将字符转换为整数会给出意外的值
本文关键字:意外 字符 转换 整数 | 更新日期: 2023-09-27 17:56:33
我有以下代码:
var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
var stringArray = stringNumber.ToCharArray();
var intArray = stringArray.Select(x => (int)x).ToArray();
我希望intArray
包含的是9
和3
的值,但它包含57
和51
,我不确定为什么?如何intArray
包含预期值?
因为,默认情况下,将字符转换为整数将返回该字符的 ASCII 值。
您可以改用int.Parse()
:
var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
var stringArray = stringNumber.ToCharArray();
var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
使用 Char.GetNumericValue,如下所示:
int[] intArray = 93.ToString()
.ToCharArray()
.Select(r=> (int) char.GetNumericValue(r))
.ToArray();
如果你的数字是int
你可以看看这个答案来获取一个int
数组,而无需将其转换为字符串。
您正在将char
转换为其numeric representation
。使用int.Parse()
尝试此操作:
var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
var stringArray = stringNumber.ToCharArray();
var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
你得到 57 而不是 9,因为将 char 转换为 int 将获得 char 的十进制值
根据此编码 http://www.fileformat.info/info/unicode/char/0039/index.htm,9 是 57
根据此编码(相同)http://www.fileformat.info/info/unicode/char/0033/index.htm 3 是 51
要获取字符的实际值,您必须将该值解析为 int int.Parse(x)
:
var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
var stringArray = stringNumber.ToCharArray();
var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
因为您将'9'
字符转换为int
代码演示。
stringArray.Select(x => int.Parse(x)).ToArray();
var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
这是因为这是 3 和 9 的 ASCII 代码。
它正在正确转换,您只是在获取字符代码。尝试
int.Parse(x)
试试这个:
const int offset = (int) '0';
var intArray = stringArray.Select(x => ((int) x) - offset).ToArray();
代码的问题在于char
值在内部表示为整数。但是,整数值是字符的代码,而不是转换为整数的字符的值。例如,根据ASCII字符表,字符0
的代码是整数48
。
上面的代码获取字符的值'0'
并从数组的字符值中减去它。这是有效的,因为在 ASCII 数字中是按顺序存储的 - 从 0
到 9
的数字从代码48
传播到代码57
。减去零的代码值,将基本上生成您想要的结果。这种方法的好处是,它不依赖于您使用的默认编码(尽管我不知道是否有不遵守 ASCII 字符顺序的编码),并且因为您不需要自己记住字符代码。