Java: analisar valor int de um caracter

223

Eu só quero saber se existe uma solução melhor para analisar um número de um caractere em uma string (supondo que sabemos que o caractere no índice n é um número).

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

//result: x = 5

(inútil dizer que é apenas um exemplo)

Noya
fonte

Respostas:

444

Tente Character.getNumericValue(char).

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

produz:

x=5

O bom getNumericValue(char)é que ele também funciona com strings como "el٥"e "el५"onde ٥e são os dígitos 5 em árabe oriental e hindi / sânscrito, respectivamente.

Bart Kiers
fonte
62

Tente o seguinte:

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

se você subtrair pelo caractere '0', o valor ASCII não precisará ser conhecido.

vashishatashu
fonte
1
Qual o motivo disso? o resultado é a subtração entre o '0' no ASCI e o caractere no asci ???
ignacio chiazzo 23/08
10
@msj Porque os valores de '0', '1', '2', ...em ascii estão aumentando . Assim, por exemplo, '0' em ASCII é 48, '1' é de 49, etc. Então, se você tomar '2' - '0'você realmente só pegar 50 - 48 = 2. Veja uma tabela ASCII para entender melhor esse princípio. Além disso, 'x'significa obter o valor ascii do caractere em Java.
Kevin Van Ryckegem
1
@KevinVanRyckegem thank you! Eu estava procurando por isso - '0'funcionou ... Eu pensei que era um pouco de magia profunda na forma como Java interpretado caracteres ou qualquer outra coisa ... essa é realmente foi um caso de me mais complica algo ...
scoots
Embora este seja um truque elegante, é menos legível do que usarCharacter.getNumericValue
Janac Meena
33

Provavelmente é o melhor do ponto de vista do desempenho, mas é difícil:

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

Funciona se você assumir que seu personagem é um dígito e apenas em idiomas sempre usando Unicode, como Java ...

Alexis Dufrenoy
fonte
7
Tente isso com a string "el५"onde está o dígito 5 na Índia. :)
Bart Kiers
3
Tenho certeza que você trabalhou duro para encontrar este exemplo ... :-) Ok, se você precisar analisar dígitos não árabes, evite esse método. Como eu disse, é difícil. Mas ainda é o método mais rápido em 99,999% dos casos em que funciona.
Alexis Dufrenoy
@AlexisDufrenoy, por que a subtração de caracteres deve '0'retornar o valor inteiro?
Istiaque Ahmed 19/03/19
1
Observe os valores da tabela ASCII char '9' = int 57, char '0' = int 48, isso resulta em '9' - '0' = 57 - 48 = 9
WHDeveloper
1
Funciona como um encanto. lol @ counterexample e todos os indianos que copiaram sua resposta. a ironia.
omikes
16

Simplesmente subtraindo pelo caractere '0' (zero), um caractere (do dígito '0' para '9') pode ser convertido em int (0 a 9), por exemplo, '5' - '0' fornece int 5.

String str = "123";

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

Usando binário ANDcom 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
fonte
0
String element = "el5";
int x = element.charAt(2) - 48;

Subtraindo o valor ascii de '0' = 48 de char

Saurabh
fonte