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.

È stato utile?

Soluzione

Risposte interessanti ma i documenti dicono diversamente:

  

Utilizzare i metodi GetNumericValue per   converte un oggetto Char che rappresenta   un numero per un tipo di valore numerico. Uso    Parse e TryParse per convertire a   carattere in una stringa in un Char   oggetto. Usa ToString per convertire un Char   oggetto su un oggetto String .

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top