将字符转换为整数会给出意外的值

本文关键字:意外 字符 转换 整数 | 更新日期: 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包含的是93的值,但它包含5751,我不确定为什么?如何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 数字中是按顺序存储的 - 从 09 的数字从代码48传播到代码57。减去零的代码值,将基本上生成您想要的结果。这种方法的好处是,它不依赖于您使用的默认编码(尽管我不知道是否有不遵守 ASCII 字符顺序的编码),并且因为您不需要自己记住字符代码。