【问题标题】:How to convert char to int?如何将char转换为int?
【发布时间】:2011-04-09 14:36:09
【问题描述】:

char 转换为int 的正确方法是什么? 这给了49

int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works

我不想转成字符串再解析。

【问题讨论】:

标签: c# .net


【解决方案1】:

涵盖十六进制表示的其他一些答案的扩展:

public int CharToInt(char c) 
{
    if (c >= '0' && c <= '9') 
    {
        return c - '0';
    }
    else if (c >= 'a' && c <= 'f') 
    {
        return 10 + c - 'a';
    }
    else if (c >= 'A' && c <= 'F') 
    {
        return 10 + c - 'A';
    }

    return -1;
}

【讨论】:

    【解决方案2】:
    int val = '1' & 15;
    

    ASCII 字符 0-9 的二进制是:

    0  -   00110000

    1  -  00110001

    2  -  00110010

    3  -  00110011

    4  -  00110100

    5  -  00110101

    6  -  00110110

    7  -  00110111

    8  -  00111000

    9  -  00111001

    如果您将它们中的每一个都取入前 4 个 LSB(使用按位与 8'b00001111 等于 15),您将得到实际数字 (0000 = 0,0001=1,0010=2,... )

    【讨论】:

    • 这在类型方面是如何工作的?您在 char 和 int 之间使用按位运算符,然后返回一个 int?逻辑 AND 是否使用 char 和 int 的二进制表示并返回二进制表示,然后当您将 var 定义为 int 时,它使用该表示?
    • @mitnomed 是的,例如,如果您使用字节,那么它使用字节表示。
    【解决方案3】:

    你可以试试这样的:

    int val = Convert.ToInt32("" + '1');
    

    【讨论】:

    • 为什么不只是 .ToString()?
    • @Veikedo 他想要一个 int,而不是一个字符串。
    • 我的意思是Convert.ToInt32('1'.ToString())
    【解决方案4】:

    怎么样(char c

    int i = (int)(c - '0');
    

    char值的减法是哪个?

    API 问题(cmets),也许是扩展方法?

    public static class CharExtensions {
        public static int ParseInt32(this char value) {
            int i = (int)(value - '0');
            if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value");
            return i;
        }
    }
    

    然后使用int x = c.ParseInt32();

    【讨论】:

    • 我应该提到,我知道这一点,但还有其他方法吗?我想知道是否有 API 可以做到这一点?
    • 如果你想要一个类似于int.Parse 的行为,即在无效输入上引发异常,你需要添加额外的边界检查:if (i &lt; 0 || i &gt; 9) throw new FormatException();
    • @user386338 恐怕没有。
    • @user386338 - 更新了 an 选项 re API,还包括 @0xA3 的反馈
    • @user386338 - 查看 Joel 对内置 API 方法的回答
    【解决方案5】:
    int i = (int)char.GetNumericValue(c);
    

    另一种选择:

    int i = c & 0x0f;
    

    这也应该完成。

    【讨论】:

      【解决方案6】:

      我很惊讶没有人提到 System.Char 中内置的静态方法...

      int val = (int)Char.GetNumericValue('8');
      // val == 8
      

      【讨论】:

      • 好地方! +1 很奇怪,它返回一个double,虽然
      • 我同意,我不知道为什么它返回'double' - 单个字符怎么可能代表浮点数?
      • 有许多 Unicode 字符确实表示非整数数字,例如,U+2153
      • @dtb - 我没有考虑过。 Char.GetNumericValue('⅓') 确实返回 0.3333...。感谢您指出这一点!
      • 脚注:此功能目前在 NetMF 中不可用。
      【解决方案7】:

      您可以使用以下扩展方法:

      public static class CharExtensions
          {
              public static int CharToInt(this char c)
              {
                  if (c < '0' || c > '9')
                      throw new ArgumentException("The character should be a number", "c");
      
                  return c - '0';
              }
          }
      

      【讨论】:

      • @0xA3 范围检查通常必须在方法的开头。从语义上讲,如果我们要将char 转换为int,我们必须检查输入参数的范围,而不是输出int 值。
      • 不需要检查结果int值,因为数字字符的范围是在方法开始时执行的,所以如果指定的字符不在范围内,就会有正确的结果值数字字符将引发异常。与您提供的逻辑相同,但在方法开始时执行范围检查。
      • 抱歉,我误读了您的代码示例。有时很难看到最明显的东西。我敢打赌代码说if (c &lt; 0 || c &gt; 9)...
      【解决方案8】:

      每个人都忘记了解释为什么会发生这种情况。

      Char,基本上是一个整数,但在 ASCII 表中有一个指针。正如您在尝试解析它时可以清楚地看到的那样,所有字符都有一个相应的整数值。

      Pranay 显然有不同的字符集,这就是 HIS 代码不起作用的原因。 唯一的办法是

      int val = '1' - '0';
      

      因为这会在 '0' 的表中查找整数值,然后是“基值” 从中减去 char 格式的数字将得到原始数字。

      【讨论】:

        【解决方案9】:

        最安全的方法是使用 Int32.TryParse 方法。看这里: http://dotnetperls.com/int-tryparse

        【讨论】:

        • TryParse 用于字符串而不是字符
        • 是的,但仍然是完成转换的最安全方式
        • 将单个字符转换为整数是安全问题?
        • 'Secure' 在这种情况下意味着如果您的 char 实际上不是 ascii 数字,它不会引起问题 - 它可能是多字节 unicode 字符。
        【解决方案10】:
        int val = '1' - 48;
        

        【讨论】:

        • @Luke Xu : '0' 的 ASCII 码 0x30 是十进制的 48,所以这与 '1' - '0' 相同
        【解决方案11】:
        int val = '1' - '0';
        

        这可以使用 ascii 代码来完成,其中“0”是最低的,数字字符从那里开始计数

        【讨论】:

        • 这太棒了! imo 是这里最优雅的解决方案。
        猜你喜欢
        • 2017-03-21
        • 2018-05-15
        • 2012-06-02
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 2011-12-15
        • 2015-07-11
        相关资源
        最近更新 更多