Java: analizar el valor int de un char

223

Solo quiero saber si hay una mejor solución para analizar un número de un carácter en una cadena (suponiendo que sepamos que el carácter en el índice n es un número).

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

//result: x = 5

(Inútil decir que es solo un ejemplo)

Noya
fuente

Respuestas:

444

Tratar Character.getNumericValue(char).

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

produce:

x=5

Lo bueno de esto getNumericValue(char)es que también funciona con cadenas como "el٥"y "el५"dónde ٥y son los dígitos 5 en árabe oriental e hindi / sánscrito, respectivamente.

Bart Kiers
fuente
62

Intenta lo siguiente:

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

si resta por char '0', el valor ASCII no necesita ser conocido.

vashishatashu
fuente
1
¿Cuál es la razón de eso? el resultado es la resta entre el '0' en el ASCI y el char en el asci ???
ignacio chiazzo
10
@msj Porque los valores de '0', '1', '2', ...in ascii son ascendentes. Entonces, por ejemplo, '0' en ascii es 48, '1' es 49, etc. Entonces, si lo tomas '2' - '0', realmente obtienes 50 - 48 = 2. Eche un vistazo a una tabla ASCII para comprender mejor este principio. Además, 'x'significa obtener el valor ASCII del personaje en Java.
Kevin Van Ryckegem
1
@KevinVanRyckegem gracias! Yo estaba buscando qué - '0'trabajado ... pensé que era un poco de magia profunda en la manera de Java interpreta personajes o lo que sea ... Esto fue realmente un caso de mí más de lo que complica algo ...
Scoots
Aunque este es un buen truco, es menos legible que usarloCharacter.getNumericValue
Janac Meena
33

Probablemente sea lo mejor desde el punto de vista del rendimiento, pero es difícil:

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

Funciona si asumes que tu personaje es un dígito, y solo en idiomas que siempre usan Unicode, como Java ...

Alexis Dufrenoy
fuente
77
Intente eso con la cadena "el५"donde está el dígito 5 en India. :)
Bart Kiers
3
Estoy seguro de que trabajó duro para encontrar este ejemplo ... :-) Ok, si tiene que analizar dígitos no árabes, evite este método. Como dije, es duro. Pero sigue siendo el método más rápido en el 99.999% de los casos en que funciona.
Alexis Dufrenoy
@AlexisDufrenoy, ¿por qué restar el carácter '0'devuelve el valor entero?
Istiaque Ahmed
1
Mire los valores de la tabla ASCII char '9' = int 57, char '0' = int 48, esto da como resultado '9' - '0' = 57 - 48 = 9
WHDeveloper
1
Funciona de maravilla. lol @ contraejemplo y todos los indios que copiaron tu respuesta. la ironía.
omikes
16

Simplemente restando por char '0' (cero) un char (del dígito '0' a '9') se puede convertir en int (0 a 9), por ejemplo, '5' - '0' da int 5.

String str = "123";

int a=str.charAt(1)-'0';
Miniraj Shrivastava
fuente
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
fuente
0

Usando binario ANDcon 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
fuente
0
String element = "el5";
int x = element.charAt(2) - 48;

Restando el valor ascii de '0' = 48 de char

Saurabh
fuente