【问题标题】:Casting chars to integers gives unexpected values将字符转换为整数会产生意外的值
【发布时间】:2014-04-04 13:19:10
【问题描述】:

我有以下代码:

var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
var stringArray = stringNumber.ToCharArray();
var intArray = stringArray.Select(x => (int)x).ToArray();

我希望intArray 包含值93,但它包含5751,我不知道为什么?如何让intArray 包含预期值?

【问题讨论】:

  • 您正在将 char 转换为其数字表示形式。这会将您带到它的 ASCII 码。

标签: c#


【解决方案1】:

因为默认情况下,将字符转换为整数会返回该字符的 ASCII 值。

您可以改用int.Parse()

var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
var stringArray = stringNumber.ToCharArray();
var intArray = stringArray.Select(x => int.Parse(x)).ToArray();

【讨论】:

    【解决方案2】:

    您可以使用Char.GetNumericValue 喜欢:

    int[] intArray = 93.ToString()
                     .ToCharArray()
                     .Select(r=> (int) char.GetNumericValue(r))
                     .ToArray();
    

    如果您的号码是int,您可以查看this answer 以获取int 数组,而无需将其转换为字符串。

    【讨论】:

    • +1。我已经使用 .NET 多年,但从未遇到或使用过 char.GetNumericValue 方法。学习新东西总是很好。
    【解决方案3】:

    您正在将char 投射到其numeric representation。使用int.Parse() 试试这个:

    var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
    var stringArray = stringNumber.ToCharArray();
    var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
    

    【讨论】:

      【解决方案4】:

      你得到 57 而不是 9,因为将 char 转换为 int 会得到 char 的十进制值

      根据这个编码http://www.fileformat.info/info/unicode/char/0039/index.htm9是57

      根据这个编码3是51(相同)http://www.fileformat.info/info/unicode/char/0033/index.htm

      要获取 char 的实际值,您必须将该值解析为 int int.Parse(x)

              var stringNumber = 93.ToString(CultureInfo.InvariantCulture);
              var stringArray = stringNumber.ToCharArray();
              var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
      

      【讨论】:

        【解决方案5】:

        因为您将 '9' char 转换为 int 代码 rapresentation

        stringArray.Select(x => int.Parse(x)).ToArray();
        

        【讨论】:

          【解决方案6】:
          var intArray = stringArray.Select(x => int.Parse(x)).ToArray();
          

          【讨论】:

            【解决方案7】:

            这是因为那是 3 和 9 的 ASCII code

            它正在正确转换,你只是得到了字符代码。试试

            int.Parse(x)
            

            【讨论】:

              【解决方案8】:

              试试这个:

              const int offset = (int) '0';
              var intArray = stringArray.Select(x => ((int) x) - offset).ToArray();
              

              您的代码的问题是char 值在内部表示为整数。但是,整数值是字符的代码,而不是转换为整数的该字符的值。比如字符0的代码是整数48,根据ASCII character table

              上面的代码获取字符'0' 的值并从数组的字符值中减去它。这是可行的,因为 ASCII 数字是按顺序存储的——从 09 的数字从代码 48 扩展到代码 57。减去零的代码值,基本上会产生你想要的结果。这种方法的好处是它不依赖于您使用的默认编码(尽管我不知道是否存在不尊重 ASCII 字符顺序的编码),并且因为您不需要自己记住字符代码。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-02-09
                • 1970-01-01
                • 2011-11-19
                • 1970-01-01
                • 2011-12-21
                • 2017-06-11
                • 1970-01-01
                相关资源
                最近更新 更多