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.