在C#中将char转换为int

231

我在c#中有一个字符:

char foo = '2';

现在我想将2转换为int类型。我发现Convert.ToInt32返回的是字符的实际十进制值而不是数字2。下面的代码可以解决:

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

int.parse仅适用于字符串。

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

20个回答

3

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

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

2

我正在使用 Compact Framework 3.5,但是没有 "char.Parse" 方法。 我认为使用 Convert 类并不错。(参见《CLR via C#》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字符


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

1
我搜索了最优化的方法,但非常惊讶地发现最好的方法是最简单的,也是最流行的答案:
public static int ToIntT(this char c) =>
    c is >= '0' and <= '9'?
        c-'0' : -1;

以下是我尝试过的方法列表:

c-'0' //current
switch //about 25% slower, no method with disabled isnum check (it is but performance is same as with enabled)
0b0000_1111 & (byte) c; //same speed
Uri.FromHex(c) /*2 times slower; about 20% slower if use my isnum check*/ (c is >= '0' and <= '9') /*instead of*/ Uri.IsHexDigit(testChar)
(int)char.GetNumericValue(c); // about 20% slower. I expected it will be much more slower.
Convert.ToInt32(new string(c, 1)) //3-4 times slower

请注意,isnum检查(第一个代码块中的第二行)占用了约30%的性能,因此如果您确定是字符,则应将其去除。测试误差为约5%。

1
一个非常快速、简单的方法就是将字符0-9转换为整数: C#将char值视为整数。
char c = '7'; // ASCII code 55
int i = c - 48; // integer of 7

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;
}

0

我更喜欢使用switch方法。虽然性能与c - '0'相同,但我发现switch更易于阅读。

基准测试:

方法 平均值 误差 标准偏差 每次分配的内存
CharMinus0 90.24 微秒 7.1120 微秒 0.3898 微秒 39.18 KB
CharSwitch 90.54 微秒 0.9319 微秒 0.0511 微秒 39.18 KB

代码:

public static int CharSwitch(this char c, int defaultvalue = 0) {
    switch (c) {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        default: return defaultvalue;
    }
}
public static int CharMinus0(this char c, int defaultvalue = 0) {
    return c >= '0' && c <= '9' ? c - '0' : defaultvalue;
}

0
使用Uri.FromHex
为了避免异常,请使用Uri.IsHexDigit
char testChar = 'e';
int result = Uri.IsHexDigit(testChar) 
               ? Uri.FromHex(testChar)
               : -1;

-1
这对我有用:
int bar = int.Parse("" + foo);

7
除了不够易读之外,它与 int.Parse(foo.ToString()) 有何不同? - svick

-5
我看到了很多答案,但它们对我来说似乎很混乱。难道我们不能简单地使用类型转换吗?
例如:
int s;
char i= '2';
s = (int) i;

2
这将返回字符2的ASCII代码,而不是值2。 - cavpollo
那么使用 char.GetNumericValue(它返回一个 double 值),然后将其转换为 int,怎么样? - gamerdev
是的,这就是@Chad Grant所接受的答案所提出的。 - cavpollo
这实际上就是我在发现这个堆栈时正在寻找的内容。 - Lilith Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接