Java: analyser la valeur int d'un caractère


223

Je veux juste savoir s'il y a une meilleure solution pour analyser un nombre à partir d'un caractère dans une chaîne (en supposant que nous savons que le caractère à l'index n est un nombre).

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

//result: x = 5

(inutile de dire que ce n'est qu'un exemple)

Réponses:


444

Essayez Character.getNumericValue(char).

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

produit:

x=5

La bonne chose à propos de cela getNumericValue(char)est qu'il fonctionne également avec des chaînes comme "el٥"et "el५"٥et sont les chiffres 5 en arabe oriental et en hindi / sanskrit respectivement.


62

Essayez ce qui suit:

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

si u soustrait par char '0', la valeur ASCII n'a pas besoin d'être connue.


1
Quelle en est la raison? le résultat est la soustraction entre le '0' dans l'ASCI et le caractère dans l'asci ???
ignacio chiazzo

10
@msj Parce que les valeurs de '0', '1', '2', ...in ascii sont croissantes. Par exemple, «0» en ascii est 48, «1» est 49, etc. Donc, si vous prenez, '2' - '0'vous obtenez vraiment juste 50 - 48 = 2. Jetez un œil à une table ASCII afin de mieux comprendre ce principe. En outre, 'x'signifie obtenir la valeur ascii du caractère en Java.
Kevin Van Ryckegem

1
@KevinVanRyckegem merci! Je cherchais pourquoi - '0'ça fonctionnait ... Je pensais que c'était une magie profonde dans la façon dont Java interprétait les caractères ou quoi que ce soit ... c'était vraiment un cas pour moi de compliquer quelque chose ...
scoots

Bien que ce soit une astuce Character.getNumericValue
intéressante

33

C'est probablement le meilleur du point de vue des performances, mais c'est rude:

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

Cela fonctionne si vous supposez que votre personnage est un chiffre, et uniquement dans les langues utilisant toujours Unicode, comme Java ...


7
Essayez cela avec la chaîne "el५"où se trouve le chiffre 5 en Inde. :)
Bart Kiers

3
Je suis sûr que vous avez travaillé dur pour trouver cet exemple ... :-) Ok, si vous devez analyser des chiffres non arabes, évitez cette méthode. Comme je l'ai dit, c'est rude. Mais c'est toujours la méthode la plus rapide dans 99,999% des cas où cela fonctionne.
Alexis Dufrenoy

@AlexisDufrenoy, pourquoi la soustraction de caractère devrait-elle '0'renvoyer la valeur entière?
Istiaque Ahmed

1
Regardez les valeurs de la table ASCII char '9' = int 57, char '0' = int 48, cela donne '9' - '0' = 57 - 48 = 9
WHDeveloper

1
fonctionne comme un charme. lol @ counterexample et tous les indiens qui ont copié votre réponse. L'ironie.
omikes

16

En soustrayant simplement par char '0' (zéro) un char (du chiffre '0' à '9') peut être converti en int (0 à 9), par exemple, '5' - '0' donne 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

Utilisation du binaire ANDavec 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;

Soustraire la valeur ascii de «0» = 48 du caractère

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.