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)

Noya
la source

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.

Bart Kiers
la source
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.

vashishatashu
la source
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 ...

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

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

Saurabh
la source