我在 c# 中有一个 char:
char foo = '2';
现在我想将 2 转换为 int。 我发现 Convert.ToInt32 返回 char 的实际十进制值,而不是数字 2。以下内容将起作用:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse 也仅适用于字符串。
C# 中是否没有本地函数可以从 char 转换为 int 而不将其转换为字符串? 我知道这是微不足道的,但奇怪的是没有任何本地东西可以直接进行转换。
这会将其转换为
int
:
char foo = '2';
int bar = foo - '0';
这是可行的,因为每个字符在内部都由一个数字表示。字符
'0'
到'9'
由连续的数字表示,因此找到字符'0'
和'2'
之间的差异会得到数字2。
有趣的答案,但文档的说法不同:
使用
方法 转换代表的GetNumericValue
对象 数字到数值类型。使用Char
和Parse
转换 将字符串中的字符转换为TryParse
目的。使用Char
转换ToString
对象到Char
对象。String
有没有人考虑过像这样使用
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());
尽管下面的数值对于数字和基本拉丁字符来说是相同的。
真正的方法是:
int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);
“theNameOfYourInt” - 您希望将 char 转换为的 int。
“theNameOfYourChar” - 您想要使用的 Char,因此它将转换为 int。
留下一切。
原理:
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;
}
我同意@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());
一种非常快速、简单的方法是将字符 0-9 转换为整数: C# 将 char 值视为整数。
char c = '7'; // ASCII code 55
int i = c - 48; // integer of 7
我使用的是 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 字符
根据字符非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 检查(第一个代码块中的第二行)占用了大约 30% 的性能,因此如果您确定
c
是 char,则应该将其取消。测试误差约为 5%
使用这个:
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;
}
int x = (int)Char.GetNumericValue(char)
这对我有用:
int bar = int.Parse("" + foo);
使用 Uri.FromHex。
并避免异常Uri.IsHexDigit。
char testChar = 'e';
int result = Uri.IsHexDigit(testChar)
? Uri.FromHex(testChar)
: -1;
我更喜欢switch方法。 性能与 c - '0' 相同,但我发现该开关更易于阅读。
基准:
方法 | 意思是 | 错误 | 标准偏差 | 分配的内存/操作 |
---|---|---|---|---|
字符减0 | 90.24 我们 | 7.1120 我们 | 0.3898 我们 | 39.18 KB |
字符切换 | 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;
}
我看过很多答案,但它们对我来说似乎很困惑。我们不能简单地使用类型转换吗?
例如:-
int s;
char i= '2';
s = (int) i;