Gute Stelle! +1 Sehr seltsam, dass es ein doublegibt
Marc Gravell
4
Ich stimme zu, ich kann nicht herausfinden, warum es 'double' zurückgibt - wie kann ein einzelnes Zeichen möglicherweise eine Gleitkommazahl darstellen?
Joel Mueller
49
Es gibt viele Unicode-Zeichen, die eine nicht ganzzahlige Zahl darstellen, z. B. U + 2153 .
dtb
26
@dtb - das hatte ich nicht bedacht. Char.GetNumericValue('⅓')kommt in der Tat zurück 0.3333.... Vielen Dank für den Hinweis!
Joel Mueller
1
Fuß Hinweis: Diese Funktion ist derzeit in NetMF nicht verfügbar.
GisMofx
40
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?
publicstaticclassCharExtensions{publicstaticintParseInt32(thischarvalue){int i =(int)(value-'0');if(i <0|| i >9)thrownewArgumentOutOfRangeException("value");return i;}}
Ich hätte erwähnen sollen, ich wusste davon, aber gibt es einen anderen Weg? Ich wollte wissen, ob es eine API dafür gibt.
TVR
4
Wenn Sie ein ähnliches Verhalten wünschen 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();
Dirk Vollmar
@ user386338 Ich fürchte, das gibt es nicht.
Eugene Cheverda
@ user386338 - aktualisiert mit einer Option bezüglich der API, einschließlich des Feedbacks von @ 0xA3
Marc Gravell
@ user386338 - siehe Joels Antwort für eine eingebaute API-Methode
Marc Gravell
21
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.
@ Luke Xu: '0' hat den ASCII-Code 0x30, der 48 dezimal ist, also ist dies dasselbe wie '1' - '0'
NiKiZe
3
Sie können die folgende Erweiterungsmethode verwenden:
publicstaticclassCharExtensions{publicstaticintCharToInt(thischar c){if(c <'0'|| c >'9')thrownewArgumentException("The character should be a number","c");return c -'0';}}
@ 0xA3 Die Bereichsprüfung muss im Allgemeinen am Anfang der Methode stehen. Semantisch , wenn wir zu konvertieren sind , charum intuns Bereich des Eingangsparameters zu überprüfen, nicht der intAusgangswert.
Eugene Cheverda
Der Ergebniswert 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.
Eugene Cheverda
Entschuldigung, ich habe Ihr Codebeispiel falsch gelesen. Manchmal ist es schwierig, die offensichtlichsten Dinge zu erkennen. Ich würde wetten, dass der Code sagte if (c < 0 || c > 9)...
Ja, es ist aber immer noch der sicherste Weg, um die Konvertierung
durchzuführen
1
Das Konvertieren eines einzelnen Zeichens in eine Ganzzahl ist eine Sicherheitsfrage?
Joel Mueller
1
'Sicher' bedeutet in diesem Fall, dass es keine Probleme verursacht, wenn Ihr Zeichen keine ASCII-Nummer ist - es kann sich um ein Multi-Byte-Unicode-Zeichen handeln.
Robin Bennett
1
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, ...)
Wie funktioniert das in Bezug auf Typen? Sie verwenden einen bitweisen Operator zwischen einem Zeichen und einem Int und geben dann ein Int zurück? Verwendet das logische UND die binäre Darstellung sowohl des Zeichens als auch des int und gibt eine binäre Darstellung zurück. Wenn Sie dann die var als int definieren, verwendet es diese Darstellung?
Mitomed
@mitnomed yes und wenn Sie beispielsweise Byte verwenden, wird die Bytedarstellung verwendet.
Eine Erweiterung einiger anderer Antworten, die die hexadezimale Darstellung abdeckt:
publicintCharToInt(char c){if(c >='0'&& c <='9'){return c -'0';}elseif(c >='a'&& c <='f'){return10+ c -'a';}elseif(c >='A'&& c <='F'){return10+ c -'A';}return-1;}
Antworten:
Ich bin überrascht, dass niemand die statische Methode erwähnt hat, die direkt in
System.Char
...quelle
double
gibtChar.GetNumericValue('⅓')
kommt in der Tat zurück0.3333...
. Vielen Dank für den Hinweis!wie wäre es mit (für
char c
)Was bedeutet Subtraktion des Zeichenwerts?
Bezüglich der API-Frage (Kommentare), vielleicht eine Erweiterungsmethode?
dann benutze
int x = c.ParseInt32();
quelle
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
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.quelle
Noch eine Option:
Dies sollte auch dies erreichen.
quelle
Dies kann mit ASCII-Codes erfolgen, wobei '0' die niedrigste ist und die Anzahl der Zeichen von dort hoch zählt
quelle
quelle
Sie können die folgende Erweiterungsmethode verwenden:
quelle
char
umint
uns Bereich des Eingangsparameters zu überprüfen, nicht derint
Ausgangswert.int
muss 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
quelle
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, ...)
quelle
Sie können so etwas ausprobieren:
quelle
Convert.ToInt32('1'.ToString())
Eine Erweiterung einiger anderer Antworten, die die hexadezimale Darstellung abdeckt:
quelle