Java: analizza il valore int da un carattere


223

Voglio solo sapere se esiste una soluzione migliore per analizzare un numero da un carattere in una stringa (supponendo che sappiamo che il carattere nell'indice n è un numero).

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

//result: x = 5

(inutile dire che è solo un esempio)

Risposte:


444

Prova Character.getNumericValue(char).

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

produce:

x=5

La cosa bella getNumericValue(char)è che funziona anche con stringhe come "el٥"e "el५"dove ٥e sono le cifre 5 rispettivamente in arabo orientale e hindi / sanscrito.


62

Prova quanto segue:

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

se si sottrae dal carattere '0', non è necessario conoscere il valore ASCII.


1
Qual è la ragione? il risultato è la sottrazione tra '0' nell'ASCI e il carattere nell'asci ???
ignacio chiazzo,

10
@msj Perché i valori di '0', '1', '2', ...in ascii sono in aumento . Quindi, ad esempio '0' in ascii è 48, '1' è 49, ecc. Quindi, se prendi '2' - '0', prendi davvero 50 - 48 = 2. Dai un'occhiata a una tabella ASCII per capire meglio questo principio. Inoltre, 'x'significa ottenere il valore ASCII del personaggio in Java.
Kevin Van Ryckegem,

1
@KevinVanRyckegem grazie! Stavo cercando il motivo per cui ha - '0'funzionato ... Ho pensato che fosse una magia profonda nel modo in cui Java interpretava i caratteri o altro ... questo è stato davvero un mio caso per complicare qualcosa ...
scoots

Anche se questo è un trucco accurato, è meno leggibile rispetto all'utilizzoCharacter.getNumericValue
Janac Meena,

33

Questo è probabilmente il migliore dal punto di vista delle prestazioni, ma è approssimativo:

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

Funziona se pensi che il tuo personaggio sia una cifra e solo nelle lingue che usano sempre Unicode, come Java ...


7
Provalo con la stringa in "el५"cui si trova la cifra 5 in India. :)
Bart Kiers,

3
Sono sicuro che hai lavorato duramente per trovare questo esempio ... :-) Ok, se devi analizzare cifre non arabe, evita questo metodo. Come ho detto, è difficile. Ma è ancora il metodo più veloce nel 99,999% dei casi in cui funziona.
Alexis Dufrenoy,

@AlexisDufrenoy, perché il carattere sottratto dovrebbe '0'restituire il valore intero?
Istiaque Ahmed,

1
Guarda i valori dalla tabella ASCII char '9' = int 57, char '0' = int 48, questo si traduce in '9' - '0' = 57 - 48 = 9
WHDeveloper

1
funziona come un fascino. lol @ counterexample e tutti gli indiani che hanno copiato la tua risposta. l'ironia.
omike

16

Sottraendo semplicemente dal carattere '0' (zero) un carattere (della cifra da '0' a '9') può essere convertito in int (da 0 a 9), ad es. '5' - '0' dà 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

Utilizzo 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

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

Sottraendo il valore ASCII di '0' = 48 dal carattere

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.