Java: parse int value dari char


223

Saya hanya ingin tahu apakah ada solusi yang lebih baik untuk mem-parsing angka dari karakter dalam string (dengan asumsi kita tahu bahwa karakter pada indeks n adalah angka).

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

//result: x = 5

(Tidak berguna untuk mengatakan bahwa itu hanya sebuah contoh)

Jawaban:


444

Coba Character.getNumericValue(char).

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

menghasilkan:

x=5

Yang menyenangkan tentang itu getNumericValue(char)adalah bahwa ia juga bekerja dengan string seperti "el٥"dan di "el५"mana ٥dan ५adalah angka 5 di Arab Timur dan Hindi / Sansekerta masing-masing.


62

Coba yang berikut ini:

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

jika kamu kurangi dengan char '0', nilai ASCII tidak perlu diketahui.


1
Apa alasannya? hasilnya adalah substraksi antara '0' di ASCI dan char di asci ???
— ignacio chiazzo

10
@msj Karena nilai-nilai '0', '1', '2', ...di ascii naik. Jadi misal '0' di ascii adalah 48, '1' adalah 49, dll. Jadi, jika Anda mengambil, '2' - '0'Anda hanya mendapatkan 50 - 48 = 2. Lihatlah tabel ASCII untuk memahami prinsip ini dengan lebih baik. Juga, 'x'berarti mendapatkan nilai ascii dari karakter di Jawa.
— Kevin Van Ryckegem

1
@KevinVanRyckegem terima kasih! Saya mencari mengapa - '0'bekerja ... Saya pikir itu adalah sihir yang dalam tentang bagaimana Java menafsirkan karakter atau apa pun ... ini benar-benar kasus saya karena menyulitkan sesuatu ...
— berlari

Meskipun ini adalah trik yang rapi, itu kurang dapat dibaca daripada menggunakanCharacter.getNumericValue
— Janac Meena

33

Itu mungkin yang terbaik dari sudut pandang kinerja, tapi itu kasar:

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

Ini berfungsi jika Anda menganggap karakter Anda digit, dan hanya dalam bahasa yang selalu menggunakan Unicode, seperti Java ...


7
Coba itu dengan string di "el५"mana ५digit 5 ​​di India. :)
— Bart Kiers

3
Saya yakin Anda bekerja keras untuk menemukan contoh ini ... :-) Oke, jika Anda harus menguraikan digit non-arab, hindari metode ini. Seperti yang saya katakan, itu kasar. Tapi itu masih merupakan metode tercepat dalam 99,999% kasus di mana ia bekerja.
— Alexis Dufrenoy

@AlexisDufrenoy, mengapa mengurangi karakter '0'mengembalikan nilai integer?
— Istiaque Ahmed

1
Lihatlah nilai-nilai dari tabel ASCII char '9' = int 57, char '0' = int 48, ini menghasilkan '9' - '0' = 57 - 48 = 9
— WHDeveloper

1
bekerja seperti pesona. lol @ counterexample dan semua orang India yang menyalin jawaban Anda. ironi itu.
— omikes

16

Dengan hanya mengurangi dengan karakter '0' (nol) karakter (dari digit '0' hingga '9') dapat dikonversi menjadi int (0 hingga 9), misalnya, '5' - '0' memberikan 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

Menggunakan biner ANDdengan 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;

Mengurangkan nilai ascii dari '0' = 48 dari char

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.