C#中为何Parse可用而Convert.ToInt32无法正确工作?
问题描述
我想把字符串str中的每个数字平方后拼接到字符串pow中,写了如下代码:
string str = "1234"; string pow = ""; foreach(char c in str) { pow += Math.Pow(Convert.ToInt32(c), 2); }
预期返回结果为14916,但实际返回:2401250026012704。
而使用int.Parse(c.ToString())的代码能得到正确结果:
foreach(char c in str) { int i = int.Parse(c.ToString()); pow += Math.Pow(i, 2); }
请问为何Parse可用而Convert.ToInt32无法正确工作?
原因解析
这俩方法处理字符的逻辑根本不一样:
Convert.ToInt32(c)是直接取字符的Unicode编码值转成整数。比如字符'1'的编码是49,'2'是50,你相当于在算49²=2401、50²=2500、51²=2601、52²=2704,拼起来就是你看到的错误结果2401250026012704。int.Parse(c.ToString())是先把单个字符转成字符串(比如'1'变"1"),再解析成对应的数字1,平方后是1,按这个逻辑处理每个字符,自然得到正确的14916。
要是想用Convert类实现正确转换,也可以写Convert.ToInt32(c) - '0'——因为数字字符的编码是连续的,'0'的编码是48,用目标字符的编码减去'0'的编码,就能得到对应的数字值。
内容的提问来源于stack exchange,提问作者Barta
相关产品推荐
相关产品推荐

