Java: phân tích giá trị int từ một char


223

Tôi chỉ muốn biết liệu có một giải pháp tốt hơn để phân tích một số từ một ký tự trong một chuỗi (giả sử rằng chúng ta biết rằng ký tự ở chỉ số n là một số).

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

//result: x = 5

(vô dụng khi nói rằng đó chỉ là một ví dụ)

Câu trả lời:


444

Hãy thử Character.getNumericValue(char).

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

sản xuất:

x=5

Điều thú vị getNumericValue(char)là nó cũng hoạt động với các chuỗi như "el٥""el५"ở đâu ٥là các chữ số 5 tương ứng trong tiếng Ả Rập và tiếng Hindi / tiếng Phạn.


62

Hãy thử như sau:

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

nếu bạn trừ đi char '0', giá trị ASCII không cần phải biết.


1
Lý do về điều đó là gì? kết quả là sự thay thế giữa '0' trong ASCI và char trong asci ???
ignacio chiazzo

10
@msj Vì các giá trị của '0', '1', '2', ...ascii đang tăng dần. Vì vậy, ví dụ '0' trong ascii là 48, '1' là 49, v.v ... Vì vậy, nếu bạn đưa '2' - '0'bạn thực sự chỉ cần lấy 50 - 48 = 2. Hãy xem bảng ASCII để hiểu rõ hơn về nguyên tắc này. Ngoài ra, 'x'có nghĩa là lấy giá trị ascii của ký tự trong Java.
Kevin Van Ryckegem

1
@KevinVanRyckegem cảm ơn bạn! Tôi đang tìm kiếm lý do tại sao - '0'làm việc ... Tôi nghĩ rằng đó là một phép thuật sâu sắc trong cách Java diễn giải các ký tự hoặc bất cứ điều gì ... đây thực sự là một trường hợp của tôi vì đã làm phức tạp một cái gì đó ...
bắn vào

Mặc dù đây là một thủ thuật gọn gàng, nhưng nó ít đọc hơn so với sử dụngCharacter.getNumericValue
Janac Meena

33

Đó có lẽ là tốt nhất từ ​​quan điểm hiệu suất, nhưng nó thô:

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

Nó hoạt động nếu bạn cho rằng ký tự của bạn là một chữ số và chỉ trong các ngôn ngữ luôn sử dụng Unicode, như Java ...


7
Hãy thử điều đó với chuỗi "el५"chữ số 5 ở Ấn Độ. :)
Bart Kiers

3
Tôi chắc rằng bạn đã làm việc chăm chỉ để tìm ví dụ này ... :-) Ok, nếu bạn phải phân tích các chữ số không phải tiếng Ả Rập, hãy tránh phương pháp này. Như tôi đã nói, nó thô bạo. Nhưng nó vẫn là phương pháp nhanh nhất trong 99.999% trường hợp nó hoạt động.
Alexis Dufrenoy

@AlexisDufrenoy, tại sao phép trừ ký tự '0'trả về giá trị nguyên?
Istiaque Ahmed

1
Nhìn vào các giá trị từ bảng ASCII char '9' = int 57, char '0' = int 48, kết quả này trong '9' - '0' = 57 - 48 = 9
WHDeveloper

1
hoạt động như một lá bùa. lol @ counterexample và tất cả những người Ấn Độ đã sao chép câu trả lời của bạn. sự trớ trêu.
omike

16

Chỉ cần trừ đi bằng char '0' (không), một char (của chữ số '0' thành '9') có thể được chuyển đổi thành int (0 đến 9), ví dụ: '5' - '0' cho 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

Sử dụng nhị phân ANDvới 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;

Trừ giá trị ascii của '0' = 48 từ char

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.