Jaki jest właściwy sposób konwersji a charna int? To daje 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Nie chcę konwertować na ciąg, a następnie go analizować.
Jaki jest właściwy sposób konwersji a charna int? To daje 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Nie chcę konwertować na ciąg, a następnie go analizować.
Odpowiedzi:
Dziwię się, że nikt nie wspomniał o metodzie statycznej wbudowanej w System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
doublejednak
Char.GetNumericValue('⅓')rzeczywiście wraca 0.3333.... Dzięki za zwrócenie uwagi!
jak o (o char c)
int i = (int)(c - '0');
co oznacza odjęcie wartości char?
Czy pytanie o API (komentarze), 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żyj int x = c.ParseInt32();
int.Parse, tj. Wyjątek jest zgłaszany przy nieprawidłowym wejściu, musisz dodać dodatkowe granice sprawdzające:if (i < 0 || i > 9) throw new FormatException();
To, o czym wszyscy zapominają, to wyjaśnienie DLACZEGO tak się dzieje.
Char jest w zasadzie liczbą całkowitą, ale ze wskaźnikiem w tabeli ASCII. Wszystkie znaki mają odpowiadającą im wartość całkowitą, co wyraźnie widać, próbując ją przeanalizować.
Pranay ma wyraźnie inny zestaw znaków, dlatego jego kod nie działa. jedyny sposób to
int val = '1' - '0';
ponieważ wyszukuje wartość całkowitą w tabeli, '0'która jest wtedy „wartością podstawową”, odejmując od niej liczbę w formacie znakowym, otrzymamy oryginalną liczbę.
Możesz użyć następującej metody 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';
}
}
charna, intmusimy sprawdzić zakres parametru wejściowego, a nie intwartość wyjściową .
intwartości wyniku, ponieważ zakres znaków numerycznych został wykonany na początku metody, więc wynikowa wartość będzie poprawna, jeśli podany znak nie znajduje się w zakresie znaków numerycznych, zostanie wyrzucony wyjątek. Ta sama logika, którą podałeś, ale sprawdzanie zakresu jest wykonywane na początku metody.
if (c < 0 || c > 9)...
Najbezpieczniejszym sposobem osiągnięcia tego jest użycie metody Int32.TryParse. Zobacz tutaj: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
Binarny z znaków ASCII 0-9 to:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
a jeśli weźmiesz do każdego z nich pierwsze 4 LSB (używając bitowego AND z 8'b00001111, co równa się 15), otrzymasz rzeczywistą liczbę (0000 = 0,0001 = 1,0010 = 2, ...)
Rozszerzenie niektórych innych odpowiedzi, które obejmuje reprezentację szesnastkową:
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;
}