Domanda
Ho un carattere in c #:
char foo = '2';
Ora voglio ottenere il 2 in un int. Trovo che Convert.ToInt32 restituisca il valore decimale effettivo del carattere e non il numero 2. Funzionerà quanto segue:
int bar = Convert.ToInt32(new string(foo, 1));
int.parse funziona anche su stringhe.
Non esiste alcuna funzione nativa in C # per passare da un carattere a int senza renderlo una stringa? So che questo è banale ma sembra strano che non ci sia nulla di nativo per effettuare direttamente la conversione.
Soluzione
Risposte interessanti ma i documenti dicono diversamente:
Utilizzare i metodi
GetNumericValue
per converte un oggettoChar
che rappresenta un numero per un tipo di valore numerico. UsoParse
eTryParse
per convertire a carattere in una stringa in unChar
oggetto. UsaToString
per convertire unChar
oggetto su un oggettoString
.
http://msdn.microsoft.com/en-us/ biblioteca / system.char.aspx
Altri suggerimenti
Questo lo convertirà in un int:
char foo = '2';
int bar = foo - '0';
Funziona perché ogni personaggio è rappresentato internamente da un numero. I caratteri da "0" a "9" sono rappresentati da numeri consecutivi, quindi trovare la differenza tra i caratteri "0" e "2" comporta il numero 2.
Qualcuno ha preso in considerazione l'uso di int.Parse ()
e int.TryParse ()
in questo modo
int bar = int.Parse(foo.ToString());
Ancora meglio così
int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
//Do something to correct the problem
}
È molto più sicuro e meno soggetto a errori
char c = '1';
int i = (int)(c-'0');
e puoi crearne un metodo statico:
static int ToInt(this char c)
{
return (int)(c - '0');
}
Prova questo
char x = '9'; // '9' = ASCII 57
int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9
Di default usi UNICODE, quindi ti suggerisco di usare il metodo difettoso
int bar = int.Parse (foo.ToString ());
Anche se i valori numerici indicati sotto sono gli stessi per cifre e caratteri latini di base.
Questo converte in un numero intero e gestisce unicode
CharUnicodeInfo.GetDecimalDigitValue ( '2')
Puoi leggere di più qui .
Il vero modo è:
int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);
" theNameOfYourInt " - l'int in cui vuoi trasformare il tuo carattere.
" theNameOfYourChar " - Il carattere che si desidera utilizzare in modo che venga trasformato in un int.
Lascia tutto il resto.
Principio:
char foo = '2';
int bar = foo & 15;
Il binario dei caratteri 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
e se prendi in ognuno di essi i primi 4 LSB (usando bit a bit AND con 8'b00001111 che equivalgono a 15) otterrai il numero effettivo (0000 = 0,0001 = 1.0010 = 2, ... )
Utilizzo:
public static int CharToInt(char c)
{
return 0b0000_1111 & (byte) c;
}
Confronto di alcuni dei metodi basati sul risultato quando il carattere non è una cifra ASCII:
char c = '\n';
Debug.Print(<*>quot;{c & 15}"); // 10
Debug.Print(<*>quot;{c ^ 48}"); // 58
Debug.Print(<*>quot;{c - 48}"); // -38
Debug.Print(<*>quot;{(uint)c - 48}"); // 4294967258
Debug.Print(<*>quot;{char.GetNumericValue(c)}"); // -1
Sto usando Compact Framework 3.5 e non ha un "char.Parse" metodo. Penso che non sia male usare la classe Convert. (Vedi CLR via 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);
Funziona con caratteri ASCII o Unicode
Sono d'accordo con @Chad Grant
Anche se si converte in stringa, è possibile utilizzare quel valore come numerico come indicato nella domanda
int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2
Ho provato a creare un esempio più semplice e comprensibile
char v = '1';
int vv = (int)char.GetNumericValue(v);
char.GetNumericValue (v) ritorna come doppio e converte in (int)
Utilizzo più avanzato come array
int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();
Ho visto molte risposte ma mi sembrano confuse. Non possiamo semplicemente usare il tipo di cast.
Ad esempio: -
int s;
char i= '2';
s = (int) i;
Questo ha funzionato per me:
int bar = int.Parse("" + foo);