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.
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.
Jestem zaskoczony, nikt nie wspomniał statycznej metody wbudowanej w System.Char
...
int val = (int)Char.GetNumericValue('8');
// val == 8
Dobre miejsce! +1 Bardzo dziwne, że zwraca 'double', choć –
Zgadzam się, nie mogę zrozumieć, dlaczego zwraca" double "- w jaki sposób pojedyncza postać może reprezentować liczbę zmiennoprzecinkową? –
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
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();
Powinienem był wspomnieć, wiedziałem o tym, ale czy jest jakiś inny sposób? Chciałem wiedzieć, czy istnieje API, aby to zrobić? – tvr
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(); ' –
@ user386338 I obawiam się, że nie ma. –
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
int val = '1' - 48;
Dlaczego to działa? –
@Luke Xu: "0" ma kod ASCII 0x30, który wynosi 48 w systemie dziesiętnym, więc jest taki sam jak "1" - "0" – NiKiZe
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';
}
}
co jeśli c = 'x' :) – tvr
Zobacz aktualizację, przepraszam, I był w pośpiechu;) –
@ 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'. –
Najbezpieczniejszym sposobem osiągnięcia tego jest użycie metody Int32.TryParse. Zobacz tutaj: http://dotnetperls.com/int-tryparse
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.
int i = (int)char.GetNumericValue(c);
Jeszcze inna opcja:
int i = c & 0x0f;
ten powinien osiągnąć to za dobrze.
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;
}
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, ...)
Prawdopodobny duplikat pytania [to] (https://stackoverflow.com/q/239103/465053). – RBT