C# 字符串大小写转换及常用文本处理技巧详解
在 C# 开发中,处理文本的大小写转换是最基础也最常用的操作之一。除了直接调用内置的 ToUpper() 和 ToLower() 方法外,在实际业务场景中往往还涉及数字转大写、金额格式化、拼音提取等复杂逻辑。本文将首先展示标准的字符串转换实现方式,随后整理一套实用的文本处理工具代码。
C# 基础字符串大小写转换
在 .NET Framework 或 .NET Core/5+ 环境中,转换字符串大小写非常简单。最直接的方式是调用字符串对象的内置方法:
- 转为大写: 使用
string.ToUpper() - 转为小写: 使用
string.ToLower()
为了确保数据有效性,通常需要在转换前判断输入是否为空。此外,在实际应用(如 WinForms 程序)中,往往需要配合用户界面进行交互,例如通过复选框选择转换方向,并限制输入字符类型。
第 1 步:WinForms 界面实现大小写转换
目的:创建一个简单的 Windows 窗体应用程序,允许用户输入文本并通过按钮选择转换为大写或小写。
核心逻辑说明:
- 初始化界面: 设置 Label、Button 和 RadioButton 的文本及默认状态。
- 输入验证: 利用
KeyPress事件过滤非字母数字字符,仅允许用户输入有效内容。 - 执行转换: 根据单选按钮的状态,调用
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# 基础语法、代码优化及实用工具类设计的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













