Java: parsuj wartość int z char

223

Chcę tylko wiedzieć, czy istnieje lepsze rozwiązanie do parsowania liczby ze znaku w ciągu (zakładając, że wiemy, że znak o indeksie n jest liczbą).

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

//result: x = 5

(nie trzeba dodawać, że to tylko przykład)

Noya
źródło

Odpowiedzi:

444

Spróbować Character.getNumericValue(char).

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

produkuje:

x=5

Zaletą getNumericValue(char)jest to, że działa również z ciągami takimi jak "el٥"i "el५"gdzie ٥i są cyframi 5 odpowiednio w języku wschodnim arabskim i hindi / sanskrycie.

Bart Kiers
źródło
62

Spróbuj wykonać następujące czynności:

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

jeśli odejdziesz przez char '0', wartość ASCII nie musi być znana.

vashishatashu
źródło
1
Jaki jest tego powód? wynikiem jest odejmowanie między „0” w ASCI a char w asci ???
ignacio chiazzo
10
@msj Ponieważ wartości '0', '1', '2', ...in ascii rosną. Tak więc np. „0” w ascii to 48, „1” to 49 itd. Więc jeśli weźmiesz '2' - '0', naprawdę dostaniesz 50 - 48 = 2. Zajrzyj do tabeli ASCII, aby lepiej zrozumieć tę zasadę. Również 'x'środki uzyskać wartość ASCII znaku w Javie.
Kevin Van Ryckegem
1
@KevinVanRyckegem dziękuję! Szukałem, dlaczego - '0'zadziałało ... Myślałem, że to jakaś głęboka magia w tym, jak Java interpretuje znaki lub cokolwiek ... To naprawdę był mój przypadek, że coś skomplikowałem ...
scootuje
Chociaż jest to Character.getNumericValue
fajna
33

To chyba najlepsze z punktu widzenia wydajności, ale jest szorstkie:

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

Działa, jeśli założysz, że twoja postać jest cyfrą i tylko w językach zawsze używających Unicode, takich jak Java ...

Alexis Dufrenoy
źródło
7
Spróbuj tego z ciągiem, w "el५"którym cyfra 5 w Indiach. :)
Bart Kiers
3
Jestem pewien, że ciężko pracowałeś, aby znaleźć ten przykład ... :-) Ok, jeśli musisz przeanalizować cyfry nie-arabskie, unikaj tej metody. Tak jak powiedziałem, jest szorstki. Ale wciąż jest to najszybsza metoda w 99,999% przypadków, w których działa.
Alexis Dufrenoy
@AlexisDufrenoy, dlaczego odejmowanie znaku powinno '0'zwracać wartość całkowitą?
Istiaque Ahmed,
1
Spójrz na wartości z tabeli ASCII char '9' = int 57, char '0' = int 48, to daje w wyniku '9' - '0' = 57 - 48 = 9
WHDeveloper
1
działa jak marzenie. lol @ kontrprzykład i wszyscy Hindusi, którzy skopiowali twoją odpowiedź. ironia.
omikes
16

Po prostu odejmując przez char „0” (zero) char (cyfry „0” na „9”) można przekształcić w int (0 do 9), np. „5” - „0” daje int 5.

String str = "123";

int a=str.charAt(1)-'0';
Miniraj Shrivastava
źródło
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
źródło
0

Używanie pliku binarnego ANDz 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
Andrij Tołstoj
źródło
0
String element = "el5";
int x = element.charAt(2) - 48;

Odejmowanie wartości ascii „0” = 48 od char

Saurabh
źródło