Converti char in int in C #


149

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.

Risposte:


144

Risposte interessanti ma i documenti dicono diversamente:

Utilizzare i GetNumericValuemetodi per convertire un Charoggetto che rappresenta un numero in un tipo di valore numerico. Utilizzare Parsee TryParseper convertire un carattere in una stringa in un Char oggetto. Utilizzare ToStringper convertire un Char oggetto in un Stringoggetto.

http://msdn.microsoft.com/en-us/library/system.char.aspx


Ahh! quindi c'è qualcosa di nativo! Strano che ritorni un doppio. Mi piace meglio questa risposta. Grazie per segnalarlo.
Keith:

92
@KeithA: c'è un motivo per cui ritorni doppio: char.GetNumericValue('¼')rese 0,25. Le gioie di Unicode ... ;-)
Heinzi il

1
Questa non è una risposta che risponde alla domanda effettiva, Char.GetNumericValue ('o'), Char.GetNumericValue ('w') e qualsiasi carattere non numerico restituirà sempre -1 - Jeremy Ruten ha pubblicato la risposta corretta
Rusty Nail

2
@RustyNail nel caso della domanda originale - chiedendo in particolare dove sa che il personaggio rappresenta un numero - questa è la risposta giusta
Don Cheadle,

@mmcrae Io non la penso così - alla domanda iniziale chiede charal intsenza usare stringprima.
NetMage

164

Questo lo convertirà in un int:

char foo = '2';
int bar = foo - '0';

Questo 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.


5
Presuppone un determinato set di caratteri.
EricSchaefer,

8
No, finché le cifre sono in ordine (quali compilatori richiedono il set di caratteri) funzionerà, indipendentemente dal valore su cui iniziano.
Jeremy Ruten,

2
Questo va bene, tranne per il fatto che è ancora necessario eseguire prima il controllo dei limiti e a quel punto non sono sicuro che int.parse (foo.ToString ()) sia più veloce.
Matthew Flaschen,

7
@EricSchaefer Ma questo è un presupposto sicuro in C #: charè sempre UTF-16.
svick

2
@svick piccolo punto e vecchio ora, ma nel tempo da quando hai pubblicato questo abbiamo fatto uscire Core, che utilizza UTF-8. Comunque è un presupposto sicuro.
Joel Coehoorn,

84

Qualcuno ha preso in considerazione l'utilizzo int.Parse()e int.TryParse()come questo

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


2
Assolutamente l'approccio giusto. Scegli il primo se vuoi lanciare input non int, il secondo se vuoi fare qualcos'altro.
Jay Bazuzi,

Questo è un buon approccio per un metodo di conversione generico. A parte questo, è un altro esempio di come .NET promuove il bloatware. (Voglio dire, vai avanti e unit-test TryParse () e ToString () - non puoi, non praticamente).
disconnettersi il

5
@logout no, è un esempio di come una risposta su StackOverflow promuova il bloatware. Questo è davvero inutilmente gonfio, e non capisco perché questo sia considerato superiore alla sottrazione '0'dal personaggio.
Roman Starkov,

26
char c = '1';
int i = (int)(c-'0');

e puoi creare un metodo statico da esso:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

Questo è quello che stavo cercando. Potresti forse spiegare cosa stai facendo con la parte meno zero.
Xonatron

10

Prova questo

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

Il tuo commento dice '9', ma il tuo codice ha 9, che non verrà compilato.
svick

7

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.


4

Questo si converte in un numero intero e gestisce unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Puoi leggere di più qui .


4

Il vero modo è:

int theNameOfYourInt = (int) .Char.GetNumericValue (theNameOfYourChar);

"theNameOfYourInt": l'int in cui desideri trasformare il tuo carattere.

"theNameOfYourChar" - Il carattere che si desidera utilizzare in modo che venga trasformato in un int.

Lascia tutto il resto.


2

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 AND bit a bit con 8'b00001111 che equivale a 15) otterrai il numero effettivo (0000 = 0,0001 = 1.0010 = 2, ...)

Uso:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

2
Sebbene questo frammento di codice possa essere la soluzione, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
yivi il

2

Sono d'accordo con @Chad Grant

Inoltre, 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) restituisce come doppio e converte in (int)

Utilizzo più avanzato come array

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();

0

Confronto di alcuni metodi basati sul risultato quando il carattere non è una cifra ASCII:

char c = '\n';                              
Debug.Print($"{c & 15}");                   // 10
Debug.Print($"{c ^ 48}");                   // 58
Debug.Print($"{c - 48}");                   // -38
Debug.Print($"{(uint)c - 48}");             // 4294967258
Debug.Print($"{char.GetNumericValue(c)}");  // -1 

0

Sto usando Compact Framework 3.5 e non ha un metodo "char.Parse". 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 caratteri Unicode


-4

Questo ha funzionato per me:

int bar = int.Parse("" + foo);

5
In che modo è diverso int.Parse(foo.ToString()), tranne per essere meno leggibile?
svick

-5

Ho visto molte risposte ma mi sembrano confuse. Non possiamo semplicemente usare il cast di tipo.

Ad esempio: -

int s;
char i= '2';
s = (int) i;

1
Ciò restituirebbe il codice ASCII del carattere 2, non il valore 2.
cavpollo

Quindi che ne dici di usare char.GetNumericValue (Restituisce un doppio valore) e lanciarlo in int.
Studente

Sì, questo è ciò che propone la risposta accettata da @Chad Grant
cavpollo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.