C#数字转字符串后取首字符转int得到54而非预期6的问题
问题复现代码
static void Main() { int a = 612345; string b = Convert.ToString(a); char c = Convert.ToChar(b[0]); int d = Convert.ToInt32(c); Console.WriteLine(d); // 预期输出6,实际输出54 }
问题原因
C#中char本质是16位值类型,存储的是对应字符的Unicode编码值。阿拉伯数字字符'0'到'9'的编码和ASCII标准兼容,从48开始连续排布:
'0'对应编码值48'1'对应编码值49- 以此类推,
'6'对应的编码值为48 + 6 = 54
调用Convert.ToInt32传入char类型参数时,方法会直接返回该字符存储的原生编码值,不会解析字符代表的数字语义——这和传入字符串"6"时解析内容得到数字6的逻辑完全不同,因此最终输出54而非预期结果。
修复方案
任选以下一种修改方式即可得到输出6的预期结果:
- 利用数字字符连续编码的特性做差值计算,是性能最高的写法:
static void Main() { int a = 612345; string b = Convert.ToString(a); char c = b[0]; // 字符串索引器直接返回char类型,无需额外调用Convert.ToChar int d = c - '0'; Console.WriteLine(d); // 输出6 }
- 将char转为单字符字符串后再做数值转换,写法更直观:
static void Main() { int a = 612345; string b = Convert.ToString(a); char c = b[0]; int d = int.Parse(c.ToString()); // 等价写法:int d = Convert.ToInt32(c.ToString()); Console.WriteLine(d); // 输出6 }
- 使用char类型内置的数值获取方法:
static void Main() { int a = 612345; string b = Convert.ToString(a); char c = b[0]; int d = (int)char.GetNumericValue(c); // 方法返回double类型,需强转int Console.WriteLine(d); // 输出6 }
内容的提问来源于stack exchange,提问作者owm6
相关产品推荐
相关产品推荐

