Was ist der richtige Weg, um ein charzu konvertieren int? Dies gibt 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Ich möchte nicht in einen String konvertieren und ihn dann analysieren.
Was ist der richtige Weg, um ein charzu konvertieren int? Dies gibt 49:
int val = Convert.ToInt32('1');
//int val = Int32.Parse("1"); // Works
Ich möchte nicht in einen String konvertieren und ihn dann analysieren.
Antworten:
Ich bin überrascht, dass niemand die statische Methode erwähnt hat, die direkt in System.Char...
int val = (int)Char.GetNumericValue('8');
// val == 8
doublegibt
Char.GetNumericValue('⅓')kommt in der Tat zurück 0.3333.... Vielen Dank für den Hinweis!
wie wäre es mit (für char c)
int i = (int)(c - '0');
Was bedeutet Subtraktion des Zeichenwerts?
Bezüglich der API-Frage (Kommentare), vielleicht eine Erweiterungsmethode?
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;
}
}
dann benutze int x = c.ParseInt32();
int.Parse, dh dass bei ungültigen Eingaben eine Ausnahme ausgelöst wird, müssen Sie zusätzliche Grenzüberprüfungen hinzufügen:if (i < 0 || i > 9) throw new FormatException();
Was jeder vergisst, ist zu erklären, WARUM dies geschieht.
Ein Zeichen ist im Grunde eine Ganzzahl, jedoch mit einem Zeiger in der ASCII-Tabelle. Alle Zeichen haben einen entsprechenden ganzzahligen Wert, wie Sie deutlich sehen können, wenn Sie versuchen, ihn zu analysieren.
Pranay hat eindeutig einen anderen Zeichensatz, deshalb funktioniert sein Code nicht. Der einzige Weg ist
int val = '1' - '0';
Da dies den ganzzahligen Wert in der Tabelle nachschlägt, dessen Basiswert '0'dann Ihre Zahl im Zeichenformat subtrahiert, erhalten Sie die ursprüngliche Zahl.
Sie können die folgende Erweiterungsmethode verwenden:
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';
}
}
charum intuns Bereich des Eingangsparameters zu überprüfen, nicht der intAusgangswert.
intmuss nicht überprüft werden, da der Bereich der numerischen Zeichen zu Beginn der Methode ausgeführt wurde. Daher wird der korrekte Ergebniswert angezeigt. Wenn das angegebene Zeichen nicht im Bereich der numerischen Zeichen liegt, wird eine Ausnahme ausgelöst. Die gleiche Logik wie von Ihnen angegeben, jedoch die Bereichsprüfung wird zu Beginn der Methode durchgeführt.
if (c < 0 || c > 9)...
Der sicherste Weg, dies zu erreichen, ist die Verwendung der Int32.TryParse-Methode. Siehe hier: http://dotnetperls.com/int-tryparse
int val = '1' & 15;
Die Binärdatei der ASCII-Zeichen 0-9 lautet:
0 - 00110000
1 - 00110001
2 - 00110010
3 - 00110011
4 - 00110100
5 - 00110101
6 - 00110110
7 - 00110111
8 - 00111000
9 - 00111001
und wenn Sie in jedem von ihnen die ersten 4 LSB (mit bitweisem UND mit 8'b00001111, was 15 entspricht) aufnehmen, erhalten Sie die tatsächliche Zahl (0000 = 0,0001 = 1,0010 = 2, ...)
Eine Erweiterung einiger anderer Antworten, die die hexadezimale Darstellung abdeckt:
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;
}