Qual é a maneira correta de converter um charpara int? Isso fornece 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Não quero converter em string e analisá-lo.
Qual é a maneira correta de converter um charpara int? Isso fornece 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Não quero converter em string e analisá-lo.
Respostas:
Estou surpreso que ninguém tenha mencionado o método estático incorporado System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
double, no entanto
Char.GetNumericValue('⅓')realmente retorna 0.3333.... Obrigado por apontar isso!
que tal (para char c)
int i = (int)(c - '0');
qual a subtração do valor do char?
Re questão da API (comentários), talvez um método de extensão?
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;
}
}
então use int x = c.ParseInt32();
int.Parse, ou seja, que uma exceção é lançada na entrada inválida que você precisa adicionar limites adicionais verificando:if (i < 0 || i > 9) throw new FormatException();
O que todo mundo está esquecendo está explicando POR QUE isso acontece.
Um caractere é basicamente um número inteiro, mas com um ponteiro na tabela ASCII. Todos os caracteres têm um valor inteiro correspondente, como você pode ver claramente ao tentar analisá-lo.
Pranay tem claramente um conjunto de caracteres diferente, é por isso que o código HIS não funciona. o único caminho é
int val = '1' - '0';
porque isso consulta o valor inteiro na tabela, '0'que é o 'valor base' subtraindo seu número no formato char, fornecendo o número original.
int val = '1' - '0';
Isso pode ser feito usando códigos ASCII, onde '0' é o mais baixo e o número de caracteres é contado a partir daí.
Você pode usar o seguinte método de extensão:
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';
}
}
charpara int, temos que verificar a faixa do parâmetro de entrada, não o intvalor de saída .
intvalor do resultado, pois o intervalo de caracteres numéricos foi executado no início do método, portanto, haverá um valor resultante correto; se o caractere especificado não estiver no intervalo de caracteres numéricos, será gerada uma exceção. A mesma lógica que você forneceu, mas a verificação do intervalo é realizada no início do método.
if (c < 0 || c > 9)...
A maneira mais segura de fazer isso é usando o método Int32.TryParse. Veja aqui: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
O binário dos caracteres ASCII 0-9 é:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
e se você pegar em cada um deles os primeiros 4 LSB (usando AND bit a bit com 8'b00001111 igual a 15), obterá o número real (0000 = 0,0001 = 1,0010 = 2, ...)
Você pode tentar algo como isto:
int val = Convert.ToInt32("" + '1');
Convert.ToInt32('1'.ToString())
Uma extensão de algumas outras respostas que abrangem a representação hexadecimal:
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;
}