2008-10-27 11 views
93

Więc mam char w C#:C# char do int

char foo = '2'; 

teraz chcę, aby uzyskać 2 do wew. Uważam, że Convert.ToInt32 zwraca aktualną wartość dziesiętną char a nie numer 2. Następujące będzie działać:

int bar = Convert.ToInt32(new string(foo, 1)); 

int.Parse działa tylko na łańcuchach, jak również.

Czy nie ma natywnej funkcji w języku C#, aby przejść z char do int bez dokonywania ciąg znaków? Wiem, że to jest trywialne, ale wydaje się dziwne, że nie ma nic rodzimego do bezpośredniego nawrócenia.

Odpowiedz

91

Ciekawe odpowiedzi ale docs powiedzieć inaczej:

Użyj GetNumericValue metody do przekonwertować Char obiekt reprezentujący numer telefonu do numeryczna typ wartości. Użyj i i TryParse, aby przekształcić znak w postaci w ciąg znaków w obiekt Char . Użyj obiektu ToString, aby przekonwertować obiekt Char na obiekt String.

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

+0

ahh! więc jest coś rodzimego! Dziwne, że zwraca podwójną. Ta odpowiedź jest lepsza. Dziękuję za wskazanie. – KeithA

+60

@KeithA: Jest powód, dla którego powraca on podwójnie: 'char.GetNumericValue ('¼')' daje 0.25. Radości Unicode ... ;-) – Heinzi

+0

To nie jest odpowiedź, która odpowiada na rzeczywiste pytanie, Char.GetNumericValue ("o"), Char.GetNumericValue ("w") i wszelkie nie numeryczne char zawsze zwróci -1 - Jeremy Ruten opublikował poprawną odpowiedź –

103

To będzie przekonwertować go do int:

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

To działa, ponieważ każdy znak jest wewnętrznie reprezentowane przez liczby. Znaki „0” do „9” są reprezentowane przez kolejnych liczb, więc znalezienie różnicy między „0” a wynikami bohaterów „2” w liczbie 2.

+0

Co ważniejsze, dlaczego został poddany pod głosowanie? –

+0

Działa, ponieważ 0 wynosi 48. – sontek

+3

Dobiegaj, ponieważ widzę tylko mechanizm, a nie intencję. –

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

i można utworzyć metody statyczne się IT:

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

Czy ktoś uznać za pomocą int.Parse() i int.TryParse() jak ten

int bar = int.Parse(foo.ToString()); 

Jeszcze lepiej jak ten

int bar; 
if (!int.TryParse(foo.ToString(), out bar)) 
{ 
    //Do something to correct the problem 
} 

To dużo bezpieczniejsze i mniej podatne na błędy

+0

Absolutnie właściwe podejście. Wybierz pierwszy, jeśli chcesz, aby dane wejściowe nie były używane, a drugie, jeśli chcesz zrobić coś innego. –

+0

To dobre podejście do ogólnej metody konwersji. Na marginesie, jest to kolejny przykład tego, w jaki sposób .NET promuje oprogramowanie typu "bloatware". (Mam na myśli kontynuację i test jednostkowy TryParse() i ToString() - nie możesz, praktycznie nie). – logout

+4

@logout nie, jest to przykład tego, w jaki sposób odpowiedź na StackOverflow promuje bloatware. To naprawdę niepotrzebnie nadęty i nie rozumiem, dlaczego jest to uważane za lepsze od odejmowania "0" od znaku. –

8

Try This

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

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

Twój komentarz mówi "9", ale twój kod ma '9', który nie będzie się kompilował. – svick

7

Domyślnie użyć UNICODE więc sugerujemy użycie wadliwego na metodę

int bar = int.Parse(foo.ToString());

Chociaż wartości liczbowe mocy są takie same dla cyfr i podstawowych znaków łacińskich.

-5

Ten pracował dla mnie:

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

Czym różni się to od 'int.Parse (foo.ToString())', z wyjątkiem tego, że jest mniej czytelny? – svick

2

ten konwertuje na liczbę całkowitą i obsługuje Unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

Możesz przeczytać więcej here.

0

Używam Compact Framework 3.5, i nie ma metody "char.Parse". Myślę, że nie jest źle używać klasy Konwertuj. (Patrz CLR za pośrednictwem 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); 

Works with char ASCII lub char Unicode

to wszystko

antonio

0

Porównanie niektóre z metod na podstawie wyniku, gdy znak nie jest cyfrą 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 
-3

Widziałem wiele odpowiedzi ale wydają mi się mylące. Nie możemy po prostu użyć opcji Cast typu.

Dla ex: -

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

To by zwróciło kod ASCII znaku 2, a nie wartość 2. – cavpollo

+0

Następnie, jak o użyciu char.GetNumericValue (zwraca podwójną wartość) i rzutowania go do int. – Learner

+0

Tak, to właśnie przyjęta przez @Chad Grant propozycja proponuje – cavpollo

0
char foo = '2'; 
int bar = foo & 15; 

binarny z charecters ASCII 0-9 jest:

0 - 00110000

1 - 00110001

2 - 00110010

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111001

i jeśli weźmiesz każdą z nich pierwszą 4 LSB (używając bitowego ORAZ z 8'b00001111, która równa się 15), otrzymasz aktualną liczbę (0000 = 0,0001 = 1,0010 = 2, ...)

+2

Ten fragment kodu może być rozwiązaniem, [łącznie z wyjaśnieniem] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – yivi

+0

@ yivi Dzięki za komentarz, dodałem wyjaśnienie –