【发布时间】:2011-04-09 14:36:09
【问题描述】:
将char 转换为int 的正确方法是什么?
这给了49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
我不想转成字符串再解析。
【问题讨论】:
-
this 问题可能重复。
将char 转换为int 的正确方法是什么?
这给了49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
我不想转成字符串再解析。
【问题讨论】:
涵盖十六进制表示的其他一些答案的扩展:
public int CharToInt(char c)
{
if (c >= '0' && c <= '9')
{
return c - '0';
}
else if (c >= 'a' && c <= 'f')
{
return 10 + c - 'a';
}
else if (c >= 'A' && c <= 'F')
{
return 10 + c - 'A';
}
return -1;
}
【讨论】:
int val = '1' & 15;
ASCII 字符 0-9 的二进制是:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
如果您将它们中的每一个都取入前 4 个 LSB(使用按位与 8'b00001111 等于 15),您将得到实际数字 (0000 = 0,0001=1,0010=2,... )
【讨论】:
你可以试试这样的:
int val = Convert.ToInt32("" + '1');
【讨论】:
Convert.ToInt32('1'.ToString())
怎么样(char c)
int i = (int)(c - '0');
char值的减法是哪个?
API 问题(cmets),也许是扩展方法?
public static class CharExtensions {
public static int ParseInt32(this char value) {
int i = (int)(value - '0');
if (i < 0 || i > 9) throw new ArgumentOutOfRangeException("value");
return i;
}
}
然后使用int x = c.ParseInt32();
【讨论】:
int.Parse 的行为,即在无效输入上引发异常,你需要添加额外的边界检查:if (i < 0 || i > 9) throw new FormatException();
int i = (int)char.GetNumericValue(c);
另一种选择:
int i = c & 0x0f;
这也应该完成。
【讨论】:
我很惊讶没有人提到 System.Char 中内置的静态方法...
int val = (int)Char.GetNumericValue('8');
// val == 8
【讨论】:
double,虽然
Char.GetNumericValue('⅓') 确实返回 0.3333...。感谢您指出这一点!
您可以使用以下扩展方法:
public static class CharExtensions
{
public static int CharToInt(this char c)
{
if (c < '0' || c > '9')
throw new ArgumentException("The character should be a number", "c");
return c - '0';
}
}
【讨论】:
char 转换为int,我们必须检查输入参数的范围,而不是输出int 值。
int值,因为数字字符的范围是在方法开始时执行的,所以如果指定的字符不在范围内,就会有正确的结果值数字字符将引发异常。与您提供的逻辑相同,但在方法开始时执行范围检查。
if (c < 0 || c > 9)...
每个人都忘记了解释为什么会发生这种情况。
Char,基本上是一个整数,但在 ASCII 表中有一个指针。正如您在尝试解析它时可以清楚地看到的那样,所有字符都有一个相应的整数值。
Pranay 显然有不同的字符集,这就是 HIS 代码不起作用的原因。 唯一的办法是
int val = '1' - '0';
因为这会在 '0' 的表中查找整数值,然后是“基值”
从中减去 char 格式的数字将得到原始数字。
【讨论】:
最安全的方法是使用 Int32.TryParse 方法。看这里: http://dotnetperls.com/int-tryparse
【讨论】:
int val = '1' - 48;
【讨论】:
int val = '1' - '0';
这可以使用 ascii 代码来完成,其中“0”是最低的,数字字符从那里开始计数
【讨论】: