【问题标题】:Convert char to int in C#在 C# 中将 char 转换为 int
【发布时间】:2010-09-19 08:10:33
【问题描述】:

我在 c# 中有一个字符:

char foo = '2';

现在我想把 2 变成一个 int。我发现 Convert.ToInt32 返回 char 的实际十进制值而不是数字 2。以下将起作用:

int bar = Convert.ToInt32(new string(foo, 1));

int.parse 也仅适用于字符串。

C# 中是否没有本地函数可以从 char 转换为 int 而无需将其变为字符串?我知道这是微不足道的,但似乎很奇怪,没有任何原生的东西可以直接进行转换。

【问题讨论】:

    标签: c# char int


    【解决方案1】:

    这会将其转换为int

    char foo = '2';
    int bar = foo - '0';
    

    这是可行的,因为每个字符在内部都由一个数字表示。字符'0''9' 由连续的数字表示,因此查找字符'0''2' 之间的差异会得到数字2。

    【讨论】:

    • 它假定一个特定的字符集。
    • 不,它不会,只要数字是有序的(编译器需要字符集)它就会起作用,无论它们以什么值开始。
    • 这很好,只是您仍然需要先进行边界检查,此时我不确定 int.parse(foo.ToString()) 是否更快。
    • @EricSchaefer 但在 C# 中这是一个安全的假设:char 始终是 UTF-16。
    • @svick 有点老了,但是在你发布这个的时候,我们已经发布了使用 UTF-8 的 Core。不过,这仍然是一个安全的假设。
    【解决方案2】:
    char c = '1';
    int i = (int)(c - '0');
    

    你可以从中创建一个静态方法:

    static int ToInt(this char c)
    {
        return (int)(c - '0');
    }
    

    【讨论】:

    • 这就是我要找的。你也许可以解释你在用负零部分做什么。
    【解决方案3】:

    使用Uri.FromHex
    并避免出现异常Uri.IsHexDigit

    char testChar = 'e';
    int result = Uri.IsHexDigit(testChar) 
                   ? Uri.FromHex(testChar)
                   : -1;
    

    【讨论】:

      【解决方案4】:

      将字符 0-9 转换为整数的一种非常快速简单的方法: C# 将 char 值视为整数。

      字符 c = '7'; (ascii 码 55) int x = c - 48; (结果 = 7 的整数)

      【讨论】:

        【解决方案5】:

        使用这个:

        public static string NormalizeNumbers(this string text)
        {
            if (string.IsNullOrWhiteSpace(text)) return text;
        
            string normalized = text;
        
            char[] allNumbers = text.Where(char.IsNumber).Distinct().ToArray();
        
            foreach (char ch in allNumbers)
            {
                char equalNumber = char.Parse(char.GetNumericValue(ch).ToString("N0"));
                normalized = normalized.Replace(ch, equalNumber);
            }
        
            return normalized;
        }
        

        【讨论】:

          【解决方案6】:

          先将字符转为字符串,再转为整数。

          var character = '1';
          var integerValue = int.Parse(character.ToString());
          

          【讨论】:

            【解决方案7】:

            字符不是ASCII数字时基于结果的一些方法的比较:

            char c1 = (char)('0' - 1), c2 = (char)('9' + 1); 
            
            Debug.Print($"{c1 & 15}, {c2 & 15}");                                   // 15, 10
            Debug.Print($"{c1 ^ '0'}, {c2 ^ '0'}");                                 // 31, 10
            Debug.Print($"{c1 - '0'}, {c2 - '0'}");                                 // -1, 10
            Debug.Print($"{(uint)c1 - '0'}, {(uint)c2 - '0'}");                     // 4294967295, 10
            Debug.Print($"{char.GetNumericValue(c1)}, {char.GetNumericValue(c2)}"); // -1, -1
            

            【讨论】:

              【解决方案8】:

              我同意@Chad Grant

              如果您转换为字符串,那么您可以将该值用作问题中所述的数字

              int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2
              

              我试图创建一个更简单易懂的例子

              char v = '1';
              int vv = (int)char.GetNumericValue(v); 
              

              char.GetNumericValue(v) 以 double 形式返回并转换为 (int)

              作为数组的更多高级用法

              int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
              

              【讨论】:

                【解决方案9】:

                原则:

                char foo = '2';
                int bar = foo & 15;
                

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

                0   -   0011 0000
                1   -   0011 0001
                2   -   0011 0010
                3   -   0011 0011
                4   -   0011 0100
                5   -   0011 0101
                6   -   0011 0110
                7   -   0011 0111
                8   -   0011 1000
                9   -   0011 1001
                

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

                用法:

                public static int CharToInt(char c)
                {
                    return 0b0000_1111 & (byte) c;
                }
                

                【讨论】:

                • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                【解决方案10】:

                真正的方法是:

                int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);

                "theNameOfYourInt" - 您希望将 char 转换为的 int。

                "theNameOfYourChar" - 您要使用的 Char,以便将其转换为 int。

                别管其他的了。

                【讨论】:

                  【解决方案11】:

                  我使用的是 Compact Framework 3.5,但没有“char.Parse”方法。 我认为使用 Convert 类也不错。 (通过 C# 参见 CLR,Jeffrey Richter)

                  char letterA = Convert.ToChar(65);
                  Console.WriteLine(letterA);
                  letterA = 'あ';
                  ushort valueA = Convert.ToUInt16(letterA);
                  Console.WriteLine(valueA);
                  char japaneseA = Convert.ToChar(valueA);
                  Console.WriteLine(japaneseA);
                  

                  适用于 ASCII 字符或 Unicode 字符

                  【讨论】:

                    【解决方案12】:

                    有趣的答案,但文档的说法不同:

                    使用GetNumericValue 方法 转换一个Char 表示的对象 数字到数值类型。采用 ParseTryParse 转换 将字符串中的字符转换为Char 目的。使用ToString 转换Char 对象为 String 对象。

                    http://msdn.microsoft.com/en-us/library/system.char.aspx

                    【讨论】:

                    • 啊!所以有一些本土的东西!奇怪的是它返回一个双精度。我更喜欢这个答案。感谢您指出。
                    • @KeithA:它返回双倍是有原因的:char.GetNumericValue('¼') 产生 0.25。 Unicode 的乐趣... ;-)
                    • 这不是回答实际问题的答案,Char.GetNumericValue('o')、Char.GetNumericValue('w') 和任何非数字字符将始终返回 -1 - Jeremy Ruten 有贴出正确答案
                    • @RustyNail 在原始问题的情况下 - 具体询问他知道字符代表数字的位置 - this 是正确答案
                    • @mmcrae 我不这么认为 - 原始问题要求 charint 没有首先使用 string
                    【解决方案13】:

                    我看到了很多答案,但它们似乎让我感到困惑。我们不能只使用类型转换。

                    例如:-

                    int s;
                    char i= '2';
                    s = (int) i;
                    

                    【讨论】:

                    • 这将返回字符 2 的 ASCII 码,而不是值 2。
                    • 那么如何使用 char.GetNumericValue(它返回一个双精度值)并将其转换为 int。
                    • 是的,这就是@Chad Grant 接受的答案的建议
                    • 这实际上是我在找到这个堆栈时正在寻找的内容
                    【解决方案14】:

                    试试这个

                    char x = '9'; // '9' = ASCII 57
                    
                    int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
                    

                    【讨论】:

                    • 你的评论是'9',但你的代码有9,它不会编译。
                    【解决方案15】:

                    这将转换为整数并处理 unicode

                    CharUnicodeInfo.GetDecimalDigitValue('2')

                    您可以阅读更多here

                    【讨论】:

                      【解决方案16】:

                      这对我有用:

                      int bar = int.Parse("" + foo);
                      

                      【讨论】:

                      • 这与int.Parse(foo.ToString()) 有什么不同,除了可读性差?
                      【解决方案17】:

                      默认你使用UNICODE所以我建议使用faulty的方法

                      int bar = int.Parse(foo.ToString());

                      即使数字和基本拉丁字符下的数值相同。

                      【讨论】:

                        【解决方案18】:

                        有没有人考虑过像这样使用int.Parse()int.TryParse()

                        int bar = int.Parse(foo.ToString());
                        

                        这样更好

                        int bar;
                        if (!int.TryParse(foo.ToString(), out bar))
                        {
                            //Do something to correct the problem
                        }
                        

                        这样更安全,更不容易出错

                        【讨论】:

                        • 绝对正确的方法。如果您想抛出非整数输入,请选择第一个,如果您想做其他事情,请选择第二个。
                        • 这是一个通用转换方法的好方法。顺便说一句,这是 .NET 如何推广英国媒体报道软件的另一个例子。 (我的意思是继续对 TryParse() 和 ToString() 进行单元测试——实际上你不能)。
                        • @logout 不,这是 StackOverflow 上的答案如何促进膨胀软件的一个例子。这确实是不必要的臃肿,我不明白为什么这被认为优于从字符中减去'0'
                        猜你喜欢
                        • 2014-02-07
                        • 2013-08-10
                        • 2018-02-10
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-12-18
                        • 2015-01-29
                        相关资源
                        最近更新 更多