C# 字符串大小写转换及常用文本处理技巧详解

巷口听风
巷口听风
发布时间:2026-10-15| 6人浏览过
原创

在 C# 开发中,处理文本的大小写转换是最基础也最常用的操作之一。除了直接调用内置的 ToUpper() 和 ToLower() 方法外,在实际业务场景中往往还涉及数字转大写、金额格式化、拼音提取等复杂逻辑。本文将首先展示标准的字符串转换实现方式,随后整理一套实用的文本处理工具代码。

C# 基础字符串大小写转换

在 .NET Framework 或 .NET Core/5+ 环境中,转换字符串大小写非常简单。最直接的方式是调用字符串对象的内置方法:

  • 转为大写: 使用 string.ToUpper()
  • 转为小写: 使用 string.ToLower()

为了确保数据有效性,通常需要在转换前判断输入是否为空。此外,在实际应用(如 WinForms 程序)中,往往需要配合用户界面进行交互,例如通过复选框选择转换方向,并限制输入字符类型。

第 1 步:WinForms 界面实现大小写转换

目的:创建一个简单的 Windows 窗体应用程序,允许用户输入文本并通过按钮选择转换为大写或小写。

核心逻辑说明:

  1. 初始化界面: 设置 Label、Button 和 RadioButton 的文本及默认状态。
  2. 输入验证: 利用 KeyPress 事件过滤非字母数字字符,仅允许用户输入有效内容。
  3. 执行转换: 根据单选按钮的状态,调用 textBox1.Text.ToUpper() 或 textBox1.Text.ToLower()。
using System;
using System.Windows.Forms;

namespace StringCaseConverter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 界面初始化配置
            label1.Text = "输入字符串";
            label2.Text = "转换后的字符串";
            button1.Text = "确认转换";
            radioButton1.Text = "大写";
            radioButton2.Text = "小写";
            radioButton1.Checked = true; // 默认选中大写
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 检查输入是否为空或纯空格
            if (string.IsNullOrWhiteSpace(textBox1.Text))
            {
                MessageBox.Show("请输入字符串");
                return;
            }

            // 根据单选按钮选择转换模式
            if (radioButton1.Checked)
            {
                textBox2.Text = textBox1.Text.ToUpper(); 
            }
            else
            {
                textBox2.Text = textBox1.Text.ToLower();
            }
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            // 仅允许输入数字、大写字母和小写字母
            bool isDigit = e.KeyChar >= '0' && e.KeyChar <= '9';
            bool isUpper = e.KeyChar >= 'A' && e.KeyChar <= 'Z';
            bool isLower = e.KeyChar >= 'a' && e.KeyChar <= 'z';

            if (isDigit || isUpper || isLower)
            {
                e.Handled = false; // 允许输入
            }
            else
            {
                e.Handled = true; // 禁止输入非预期字符
            }
        }
    }
}

运行上述代码后,可以看到界面左侧显示输入结果,右侧显示经过指定规则转换后的文本。通过控制键盘输入事件,可以有效防止非法字符进入处理流程。

C# 常用文本与数据转换合集

在实际业务开发中,简单的字母大小写转换往往不够用。以下代码片段涵盖了数字转中文大写、Excel 风格日期运算、人民币格式化处理以及中文拼音提取等高阶需求。这些功能通常封装为静态工具类供全局调用。

1. Excel 风格月份加法处理

C# 原生 AddMonths 会在目标月天数不足时截断到当月最后一天(如 9月31日变为 9月30日),而 Excel 的逻辑是溢出到下个月初。若需与 Excel 保持行为一致,可参考以下算法:

public static DateTime ExcelCalcDate(DateTime oldDate, int monthNum)
{
    int day = oldDate.Day;
    DateTime newDate = oldDate.AddMonths(monthNum);
    
    switch (day)
    {
        case 29:
            // 如果是闰年二月29,且目标年是平年2月28,则加一天
            if (!DateTime.IsLeapYear(newDate.Year) && newDate.Month == 2 && newDate.Day == 28)
                newDate = newDate.AddDays(1);
            break;
        case 30:
            if (newDate.Month == 2)
            {
                if (DateTime.IsLeapYear(newDate.Year) && newDate.Day == 29)
                    newDate = newDate.AddDays(1);
                else if (!DateTime.IsLeapYear(newDate.Year) && newDate.Day == 28)
                    newDate = newDate.AddDays(1);
            }
            break;
        case 31:
            if (newDate.Day == 30)
            {
                if (new[] { 4, 6, 9, 11 }.Contains(newDate.Month))
                    newDate = newDate.AddDays(1);
            }
            else if (newDate.Day == 29)
            {
                if (DateTime.IsLeapYear(newDate.Year))
                    newDate = newDate.AddDays(1);
            }
            else if (newDate.Day == 28)
            {
                if (!DateTime.IsLeapYear(newDate.Year))
                    newDate = newDate.AddDays(1);
            }
            break;
    }
    return newDate;
}

2. 阿拉伯数字转中文大写

将纯数字字符串转换为中文汉字表示(如 123 -> 一二三),常用于非财务类的简单中文标识:

private static readonly string cnNumber = "零壹贰叁肆伍陆柒捌玖";

public static string NumToChineseUpperCase(int num)
{
    string str = num.ToString();
    string result = "";
    for (int i = 0; i < str.Length; i++)
    {
        int n = Convert.ToInt16(str[i].ToString());
        // 注意:实际使用时建议使用更严谨的大写数字映射表
        switch (n)
        {
            case 0: result += "〇"; break;
            case 1: result += "一"; break;
            case 2: result += "二"; break;
            case 3: result += "三"; break;
            case 4: result += "四"; break;
            case 5: result += "五"; break;
            case 6: result += "六"; break;
            case 7: result += "七"; break;
            case 8: result += "八"; break;
            default: result += "九"; break;
        }
    }
    return result;
}

3. 日期组件转中文大写

结合上述数字转换逻辑,将日期对象格式化为中文大写日期(如:二零二三年十月一日):

// 月份转换辅助函数
public static string MonthToUpperCase(int month)
{
    if (month < 10)
        return NumToChineseUpperCase(month);
    else if (month == 10)
        return "十";
    else
        return "十" + NumToChineseUpperCase(month - 10);
}

// 日转换辅助函数
public static string DayToUpperCase(int day)
{
    if (day < 20)
        return MonthToUpperCase(day); // 复用月份逻辑适配20以内
    else
    {
        string s = day.ToString();
        if (s[1] == '0')
            return NumToChineseUpperCase(Convert.ToInt16(s[0].ToString())) + "十";
        else
            return NumToChineseUpperCase(Convert.ToInt16(s[0].ToString())) + "十" + NumToChineseUpperCase(Convert.ToInt16(s[1].ToString()));
    }
}

// 完整日期转换入口
public static string DateToUpperCase(System.DateTime date)
{
    return NumToChineseUpperCase(date.Year) + "年" + 
           MonthToUpperCase(date.Month) + "月" + 
           DayToUpperCase(date.Day) + "日";
}

4. 人民币金额小写转标准大写

这是财务软件中的高频需求,要求严格遵循银行票据规范(含角分、整字处理、零位精简)。以下为兼容范围内的转换算法:

private static readonly String cnUnit = "分角元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟";

public static string GetRmbCapital(decimal num)
{
    if (num == 0) return "零元整";
    
    // 拆分整数和小数部分
    string[] parts = num.ToString().Split('.');
    string intPart = parts[0];
    string decPart = "";
    
    if (parts.Length > 1)
        decPart = parts[1];
    
    // 补全两位小数
    decPart += "00";
    decPart = decPart.Substring(0, 2);
    
    // 拼接整数与小数部分一起处理
    string allDigits = intPart + decPart;
    string rmbStr = "";
    
    try
    {
        int k = allDigits.Length - 1;
        // 限制最大长度以防溢出
        if (k >= 1 && k <= 17)
        {
            for (int i = 0; i <= k; i++)
            {
                int val = allDigits[i] - 48;
                int nextVal = (i + 1 >= k) ? 0 : allDigits[i + 1] - 48;
                
                // 处理零的合并规则
                if (val == 0)
                {
                    if (k - i == 2 || k - i == 6 || k - i == 10 || k - i == 14)
                        rmbStr += cnUnit[k - i];
                    else if (nextVal != 0)
                        rmbStr += "〇"; // 或 "零"
                }
                else
                {
                    rmbStr += cnNumber[val % 10] + cnUnit[k - i];
                }
            }
            
            // 清理多余的重复印刷单位(简化版处理)
            rmbStr = rmbStr.Replace("亿万", "亿").Replace("兆亿", "兆");
            if (rmbStr.EndsWith("元") || rmbStr.EndsWith("角"))
                rmbStr += "整";
                
            return rmbStr;
        }
    }
    catch { }
    return "";
}

5. 获取中文字符串拼音首字母

对于中文排序或搜索索引,通常需要提取拼音首字母。该算法基于 GBK 编码范围判断:

public static string GetPinyinInitial(string chineseStr, bool toUpper = true)
{
    string result = string.Empty;
    byte[] bytes = System.Text.Encoding.Default.GetBytes(chineseStr);
    
    foreach (char c in chineseStr)
    {
        // 英文字符直接转换
        if (System.Text.Encoding.Default.GetByteCount(c.ToString()) == 1)
        {
            result += char.ToUpper(c);
            continue;
        }
        
        // 中文字符按GBK码值范围映射
        int code = (short)(bytes[Array.IndexOf(bytes, System.Text.Encoding.Default.GetBytes(c.ToString())[0])] * 256 + 
                           System.Text.Encoding.Default.GetBytes(c.ToString())[1]); 
        // 注:实际循环中应正确处理字节数组偏移,此处为逻辑示意
        // 更稳妥写法:遍历字符串取每个字符的GBK编码区间
    }
    
    // 返回处理后的大写或小写字符串
    return toUpper ? result.ToUpper() : result.ToLower();
}

注:由于拼音库庞大,简易代码通常仅覆盖常见字库。生产环境建议引入成熟的拼音 NuGet 包。

6. 银行卡号每四位添加空格

使用正则表达式可快速美化长数字串,提升阅读体验:

using System.Text.RegularExpressions;

public static string FormatCardNumber(string cardNo)
{
    if (string.IsNullOrEmpty(cardNo)) return "";
    
    // 去除原有空格
    cardNo = cardNo.Replace(" ", "");
    
    // 匹配除末尾外的每4个数字组
    return Regex.Replace(cardNo, @"(\d{4}(?!$))", "$1 ");
}

以上就是 C# 字符串转换及文本处理的详细内容,更多关于 C# 基础语法、代码优化及实用工具类设计的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。