我在c#中有一个char:

char foo = '2';

现在我想把2变成一个整型。我发现皈依。ToInt32返回该字符的实际十进制值,而不是数字2。以下是可行的方法:

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

int。解析也只适用于字符串。

c#中没有本地函数可以在不使其成为字符串的情况下从char转换为int吗?我知道这是微不足道的,但这似乎很奇怪,没有本地直接进行转换。


这将把它转换为int型:

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

这是可行的,因为每个字符在内部都由一个数字表示。字符“0”到“9”由连续的数字表示,因此找出字符“0”和“2”之间的差值,结果是数字2。


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

你可以用它创建一个静态方法:

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

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

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


有趣的答案,但医生说的不一样:

使用GetNumericValue方法 转换表示的Char对象 数值类型的数字。使用 和TryParse来转换 字符串中的字符转换为Char类型 对象。使用ToString转换Char类型 object转换为String对象。

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


试试这个

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

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

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

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

尽管下面的数值对于数字和基本拉丁字符是相同的。


这招对我很管用:

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

这将转换为整数并处理unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

你可以在这里阅读更多。


我使用的是Compact Framework 3.5,没有“char”。解析”方法。 我认为使用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

我见过很多答案,但我觉得很困惑。我们不能简单地使用类型转换吗?

例:-

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

原则:

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(使用位and和8'b00001111,等于15),你会得到实际的数字(0000 = 0,0001=1,0010=2,…)

用法:

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

真正的方法是:

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

" namameofyourint " -你想要你的char被转换成的int。

" namameofyourchar " -你想要使用的Char,因此它将被转换为int型。

其他的都不要管。


我同意@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();

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

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

用这个:

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-9转换为整数: c#像对待整数一样对待char值。

Char c = '7';(ascii码55)int x = c - 48;(result = integer of 7)


使用Uri.FromHex。 为了避免异常Uri.IsHexDigit。

char testChar = 'e';
int result = Uri.IsHexDigit(testChar) 
               ? Uri.FromHex(testChar)
               : -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%的性能,所以如果您确定c是char,则应该取消它。测试误差为~5%


我更喜欢切换方法。 性能与c - '0'相同,但我发现开关更容易阅读。

基准:

Method Mean Error StdDev Allocated Memory/Op
CharMinus0 90.24 us 7.1120 us 0.3898 us 39.18 KB
CharSwitch 90.54 us 0.9319 us 0.0511 us 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;
}