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)

Noya
quelle

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.

Bart Kiers
quelle
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.

vashishatashu
quelle
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 ...

Alexis Dufrenoy
quelle
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';
Miniraj Shrivastava
quelle
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);
John McDonald
quelle
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
Andriy Tolstoi
quelle
0
String element = "el5";
int x = element.charAt(2) - 48;

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

Saurabh
quelle