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)

Noya
sumber

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.

Bart Kiers
sumber
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.

vashishatashu
sumber
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 ...

Alexis Dufrenoy
sumber
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';
Miniraj Shrivastava
sumber
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
sumber
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
Andriy Tolstoy
sumber
0
String element = "el5";
int x = element.charAt(2) - 48;

Mengurangkan nilai ascii dari '0' = 48 dari char

Saurabh
sumber