Qual è il modo corretto per convertire a charin int? Questo dà 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Non voglio convertirlo in stringa e poi analizzarlo.
Qual è il modo corretto per convertire a charin int? Questo dà 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Non voglio convertirlo in stringa e poi analizzarlo.
Risposte:
Sono sorpreso che nessuno abbia menzionato il metodo statico integrato proprio in System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
double, però
Char.GetNumericValue('⅓')effettivamente ritorna 0.3333.... Grazie per la segnalazione!
che ne dici (per char c)
int i = (int)(c - '0');
quale sottrazione del valore char?
Re la domanda API (commenti), forse un metodo di estensione?
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;
}
}
quindi utilizzare int x = c.ParseInt32();
int.Parse, ovvero che venga generata un'eccezione su un input non valido, è necessario aggiungere ulteriori limiti controllando:if (i < 0 || i > 9) throw new FormatException();
Quello che tutti dimenticano è spiegare PERCHÉ questo accade.
Un Char, è fondamentalmente un numero intero, ma con un puntatore nella tabella ASCII. Tutti i caratteri hanno un valore intero corrispondente, come puoi vedere chiaramente quando provi ad analizzarlo.
Pranay ha chiaramente un set di caratteri diverso, ecco perché il suo codice non funziona. l'unico modo è
int val = '1' - '0';
perché questo cerca il valore intero nella tabella di '0'cui è quindi il 'valore di base' sottraendo il tuo numero in formato char da questo ti darà il numero originale.
È possibile utilizzare il seguente metodo di estensione:
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';
}
}
charin, intdobbiamo controllare l'intervallo del parametro di input, non il intvalore di output .
intvalore del risultato perché l'intervallo di caratteri numerici è stato eseguito all'inizio del metodo, quindi ci sarà un valore risultante corretto, se il carattere specificato non è compreso nell'intervallo di caratteri numerici, verrà generata un'eccezione. La stessa logica che hai fornito ma il controllo dell'intervallo viene eseguito all'inizio del metodo.
if (c < 0 || c > 9)...
Il modo più sicuro per eseguire questa operazione è utilizzare il metodo Int32.TryParse. Vedi qui: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
Il binario dei caratteri 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 prendi in ognuno di essi i primi 4 LSB (usando AND bit per bit con 8'b00001111 che equivale a 15) ottieni il numero effettivo (0000 = 0,0001 = 1,0010 = 2, ...)
Un'estensione di alcune altre risposte che copre la rappresentazione esadecimale:
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;
}