Java: Analysiere den int-Wert von einem Zeichen


223

Ich möchte nur wissen, ob es eine bessere Lösung gibt, um eine Zahl aus einem Zeichen in einer Zeichenfolge zu analysieren (vorausgesetzt, wir wissen, dass das Zeichen am Index n eine Zahl ist).

String element = "el5";
String s;
s = ""+element.charAt(2);
int x = Integer.parseInt(s);

//result: x = 5

(nutzlos zu sagen, dass es nur ein Beispiel ist)

Antworten:


443

Versuchen Sie es Character.getNumericValue(char).

String element = "el5";
int x = Character.getNumericValue(element.charAt(2));
System.out.println("x=" + x);

produziert:

x=5

Das Schöne daran getNumericValue(char)ist, dass es auch mit Zeichenfolgen wie "el٥"und "el५"wo funktioniert ٥und die Ziffern 5 in Ostarabisch bzw. Hindi / Sanskrit sind.


62

Versuche Folgendes:

str1="2345";
int x=str1.charAt(2)-'0';
//here x=4;

Wenn Sie mit char '0' subtrahieren, muss der ASCII-Wert nicht bekannt sein.


1
Was ist der Grund dafür? das Ergebnis ist die Subtraktion zwischen der '0' im ASCI und dem Zeichen im ASCI ???
Ignacio Chiazzo

10
@msj Weil die Werte von '0', '1', '2', ...in ascii aufsteigend sind. Also zB '0' in ASCII ist 48, '1' ist 49 usw. Wenn du also nimmst '2' - '0', bekommst du wirklich nur 50 - 48 = 2. Schauen Sie sich eine ASCII-Tabelle an, um dieses Prinzip besser zu verstehen. 'x'Bedeutet auch, den ASCII-Wert des Zeichens in Java abzurufen.
Kevin Van Ryckegem

1
@ KevinVanRyckegem danke! Ich suchte nach dem Grund, warum es - '0'funktioniert hat ... Ich dachte, es wäre eine tiefe Magie, wie Java Zeichen oder was auch immer interpretierte ... das war wirklich ein Fall von mir,
weil

Dies ist zwar ein netter Trick ist, ist es weniger lesbar als die VerwendungCharacter.getNumericValue
Janac Meena

33

Das ist wahrscheinlich das Beste aus Sicht der Leistung, aber es ist rau:

String element = "el5";
String s;
int x = element.charAt(2)-'0';

Es funktioniert, wenn Sie annehmen, dass Ihr Zeichen eine Ziffer ist, und nur in Sprachen, die immer Unicode verwenden, wie Java ...


7
Versuchen Sie das mit der Zeichenfolge, "el५"in der sich die Ziffer 5 in Indien befindet. :)
Bart Kiers

3
Ich bin sicher, Sie haben hart gearbeitet, um dieses Beispiel zu finden ... :-) Ok, wenn Sie nicht-arabische Ziffern analysieren müssen, vermeiden Sie diese Methode. Wie ich schon sagte, es ist rau. Aber es ist immer noch die schnellste Methode in 99,999% der Fälle, in denen es funktioniert.
Alexis Dufrenoy

@AlexisDufrenoy, warum sollte das Subtrahieren eines Zeichens '0'den ganzzahligen Wert zurückgeben?
Istiaque Ahmed

1
Schauen Sie sich die Werte aus der ASCII-Tabelle char '9' = int 57, char '0' = int 48 an. Dies führt zu '9' - '0' = 57 - 48 = 9
WHDeveloper

1
klappt wunderbar. lol @ counterexample und alle Indianer, die Ihre Antwort kopiert haben. die Ironie.
Omikes

16

Durch einfaches Subtrahieren von char '0' (Null) kann ein Zeichen (von Ziffer '0' bis '9') in int (0 bis 9) umgewandelt werden, z. B. '5' - '0' ergibt int 5.

String str = "123";

int a=str.charAt(1)-'0';

6
String a = "jklmn489pjro635ops";

int sum = 0;

String num = "";

boolean notFirst = false;

for (char c : a.toCharArray()) {

    if (Character.isDigit(c)) {
        sum = sum + Character.getNumericValue(c);
        System.out.print((notFirst? " + " : "") + c);
        notFirst = true;
    }
}

System.out.println(" = " + sum);

0

Verwenden von Binär ANDmit 0b1111:

String element = "el5";

char c = element.charAt(2);

System.out.println(c & 0b1111); // => '5' & 0b1111 => 0b0011_0101 & 0b0000_1111 => 5

// '0' & 0b1111 => 0b0011_0000 & 0b0000_1111 => 0
// '1' & 0b1111 => 0b0011_0001 & 0b0000_1111 => 1
// '2' & 0b1111 => 0b0011_0010 & 0b0000_1111 => 2
// '3' & 0b1111 => 0b0011_0011 & 0b0000_1111 => 3
// '4' & 0b1111 => 0b0011_0100 & 0b0000_1111 => 4
// '5' & 0b1111 => 0b0011_0101 & 0b0000_1111 => 5
// '6' & 0b1111 => 0b0011_0110 & 0b0000_1111 => 6
// '7' & 0b1111 => 0b0011_0111 & 0b0000_1111 => 7
// '8' & 0b1111 => 0b0011_1000 & 0b0000_1111 => 8
// '9' & 0b1111 => 0b0011_1001 & 0b0000_1111 => 9

0
String element = "el5";
int x = element.charAt(2) - 48;

Subtrahieren des ASCII-Werts von '0' = 48 von char

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.