194

我在 c# 中有一个字符:

char foo = '2';

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

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

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

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

4

18 回答 18

214

这会将其转换为int

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

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

于 2008-10-27T04:51:26.540 回答
188

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

使用这些GetNumericValue方法将Char表示数字的对象转换为数值类型。使用 ParseandTryParse将字符串中的字符转换为Char 对象。用于ToStringChar 对象转换为String对象。

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

于 2009-04-28T02:20:19.333 回答
98

有没有人考虑过使用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
}

它更安全,更不容易出错

于 2008-10-27T05:39:56.987 回答
28
char c = '1';
int i = (int)(c - '0');

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

static int ToInt(this char c)
{
    return (int)(c - '0');
}
于 2008-10-27T04:52:06.320 回答
16

试试这个

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
于 2011-12-30T07:03:56.050 回答
9

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

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

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

于 2012-10-26T06:59:21.217 回答
8

这将转换为整数并处理 unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

你可以在这里阅读更多。

于 2015-04-18T02:32:38.250 回答
6

原则:

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;
}
于 2017-12-26T08:36:05.003 回答
6

真正的方法是:

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

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

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

让其他一切保持不变。

于 2018-04-12T18:08:21.907 回答
6

我同意@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();
于 2019-06-17T15:04:14.853 回答
2

我正在使用 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 字符

于 2015-08-13T06:42:52.580 回答
2

根据字符不是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
于 2017-01-14T21:54:30.860 回答
1

首先将字符转换为字符串,然后再转换为整数。

var character = '1';
var integerValue = int.Parse(character.ToString());
于 2021-06-09T17:10:38.543 回答
0

用这个:

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;
}
于 2021-06-13T06:16:22.257 回答
0

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

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

于 2021-08-10T19:41:30.190 回答
0

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

char testChar = 'e';
int result = Uri.IsHexDigit(testChar) 
               ? Uri.FromHex(testChar)
               : -1;
于 2021-09-07T13:49:04.807 回答
-1

这对我有用:

int bar = int.Parse("" + foo);
于 2013-08-26T02:07:29.473 回答
-4

我看过很多答案,但他们似乎让我感到困惑。我们不能只是简单地使用类型转换。

例如:-

int s;
char i= '2';
s = (int) i;
于 2017-05-29T18:22:34.850 回答