在 C# 中将字符转换为 int

本文关键字:转换 int 字符 | 更新日期: 2023-09-27 17:47:23

我在 c# 中有一个字符:

char foo = '2';

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

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

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

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

在 C# 中将字符转换为 int

这会将其转换为int

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

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

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

使用 GetNumericValue 方法可以 Char转换表示 数字到数值类型。用 ParseTryParse转换 字符串中的字符转换为Char 对象。使用ToString转换Char 对象到String对象。

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

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

它更安全,更不容易出错

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

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

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

试试这个

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());

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

这将转换为整数并处理 unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

您可以在此处阅读更多内容。

真正的方法是:

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

"theNameOfYourInt" - 您希望将字符转换为的整数。

"theNameOfYourChar" - 您想要使用的字符,以便将其转换为整数。

别的都留下来吧。

原则:

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

我同意@Chad格兰特的观点

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

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

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

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

煳。GetNumericValue(v( 以 double 的形式返回并转换为 (int(

作为阵列的更多改进用法

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

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

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

我使用的是紧凑型框架 3.5,但没有"char.解析"方法。我认为使用转换类还不错。 (参见 CLR 通过 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

请注意,isnum check(第一个代码块中的第二行(占用 ~30% 的性能,因此如果您确定c是字符,则应将其删除。测试错误为 ~5%

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

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

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

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

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

基准:

<样式>平均值<样式>错误StdDev<样式>分配的内存/操作
方法
查米努斯0 90.24 US 7.1120 US 0.3898 US 39.18 KB
字符开关 90.54 US 0.9319 US 0.0511 US 39.18 KB
这对

我有用:

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

我见过很多答案,但它们对我来说似乎很困惑。我们不能简单地使用类型转换吗?

例如:-

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