我在c#中有一个字符:
char foo = '2';
现在我想将2转换为int类型。我发现Convert.ToInt32返回的是字符的实际十进制值而不是数字2。下面的代码可以解决:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse仅适用于字符串。
在C#中,没有原生函数可以将char转换为int而无需将其转换为字符串。我知道这很微不足道,但似乎奇怪的是没有直接进行转换的本地方法。
首先将字符转换为字符串,然后再将其转换为整数。
var character = '1';
var integerValue = int.Parse(character.ToString());
我正在使用 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字符
当字符不是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
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
char c = '7'; // ASCII code 55
int i = c - 48; // integer of 7
使用这个:
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;
}
我更喜欢使用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;
}
char testChar = 'e';
int result = Uri.IsHexDigit(testChar)
? Uri.FromHex(testChar)
: -1;
int bar = int.Parse("" + foo);
int s;
char i= '2';
s = (int) i;
int.Parse(foo.ToString())
有何不同? - svick