2010-09-08 17 views
100

Jaki jest właściwy sposób przekonwertowania pliku char na int? Daje 49:Jak przekonwertować char na int?

int val = Convert.ToInt32('1'); 
//int val = Int32.Parse("1"); // Works 

Nie chcę przekonwertować ciąg, a następnie analizować je.

+0

Prawdopodobny duplikat pytania [to] (https://stackoverflow.com/q/239103/465053). – RBT

Odpowiedz

236

Jestem zaskoczony, nikt nie wspomniał statycznej metody wbudowanej w System.Char ...

int val = (int)Char.GetNumericValue('8'); 
// val == 8 
+16

Dobre miejsce! +1 Bardzo dziwne, że zwraca 'double', choć –

+3

Zgadzam się, nie mogę zrozumieć, dlaczego zwraca" double "- w jaki sposób pojedyncza postać może reprezentować liczbę zmiennoprzecinkową? –

+39

Istnieje wiele znaków Unicode, które reprezentują liczbę niecałkowitą, np. [U + 2153] (http://www.fileformat.info/info/unicode/char/2153/index.htm). – dtb

37

jak o (dla char c)

int i = (int)(c - '0'); 

który dokłada odejmowanie wartości char?

Na pytanie API (komentarze), być może metoda rozszerzenia?

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; 
    } 
} 

następnie użyć int x = c.ParseInt32();

+1

Powinienem był wspomnieć, wiedziałem o tym, ale czy jest jakiś inny sposób? Chciałem wiedzieć, czy istnieje API, aby to zrobić? – tvr

+4

Jeśli chcesz bahwizualizacji podobnej do 'int.Parse', to znaczy, że wyjątek jest zgłaszany na niepoprawnych danych wejściowych, musisz dodać dodatkowe sprawdzanie granic:' if (i < 0 || i > 9) throw new FormatException(); ' –

+0

@ user386338 I obawiam się, że nie ma. –

3
int val = '1' - '0'; 

Można to zrobić za pomocą kodów ASCII, gdzie „0” jest najniższa i znaki numeryczne liczyć się stamtąd

3
int val = '1' - 48; 
+0

Dlaczego to działa? –

+0

@Luke Xu: "0" ma kod ASCII 0x30, który wynosi 48 w systemie dziesiętnym, więc jest taki sam jak "1" - "0" – NiKiZe

3

Możesz użyć następująca metoda rozszerzenia:

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'; 
     } 
    } 
+0

co jeśli c = 'x' :) – tvr

+0

Zobacz aktualizację, przepraszam, I był w pośpiechu;) –

+1

@ 0xA3 Kontrola zasięgu musi być na początku metody w ogóle. Semantycznie, jeśli mamy zamienić 'char' na' int', musimy sprawdzić zakres parametru wejściowego, a nie wyjściową wartość 'int'. –

1

Najbezpieczniejszym sposobem osiągnięcia tego jest użycie metody Int32.TryParse. Zobacz tutaj: http://dotnetperls.com/int-tryparse

+0

TryParse jest dla ciągów znaków nie dla znaków – tvr

+0

Tak, ale jest to tylko najbezpieczniejszy sposób na dokonanie konwersji – MUG4N

+1

Konwersja pojedynczego znaku na liczbę całkowitą jest kwestia bezpieczeństwa? –

18

To, o czym zapomina każdy, wyjaśnia dlaczego tak się dzieje.

Char, to w zasadzie liczba całkowita, ale ze wskaźnikiem w tabeli ASCII. Wszystkie znaki mają odpowiednią wartość całkowitą, co widać wyraźnie podczas próby przeanalizowania.

Pranay ma wyraźnie inny zestaw znaków, dlatego jego kod nie działa. jedynym sposobem jest

int val = '1' - '0'; 

bo to wygląda w górę wartość całkowitą w tabeli '0' który następnie „wartość bazowa” odejmując swój numer w formacie char ze to daje oryginalny numer.

14
int i = (int)char.GetNumericValue(c); 

Jeszcze inna opcja:

int i = c & 0x0f; 

ten powinien osiągnąć to za dobrze.

0

przedłużenie niektórych innych odpowiedzi, która obejmuje reprezentację w systemie szesnastkowym:

 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; 
    } 
0

można spróbować coś takiego:

int val = Convert.ToInt32("" + '1'); 
+0

dlaczego nie tylko .ToString()? – Veikedo

+0

@Veikedo chce int, a nie string. – Crasher

+5

Mam na myśli 'Convert.ToInt32 ('1'.ToString())' – Veikedo

0
int val = '1' & 15; 

binarnego z charecters ASCII 0- 9 oznacza:

0 - 00110000

1 - 00110001

2 - 00110010

3 - 00110011

4 - 00110100

5 - 00110101

6 - 00110110

7 - 00110111

8 - 00111000

9 - 00111001

i jeśli wziąć w każdej z nich pierwszy 4 LSB (przy użyciu logiczną AND z 8'b00001111 że equels do 15) można uzyskać rzeczywistą liczbę (0000 = 0,0001 = 1,0010 = 2, ...)