Java: แยกค่า int จากถ่าน


223

ฉันแค่อยากรู้ว่ามีวิธีที่ดีกว่าในการแยกตัวเลขจากตัวละครในสตริง (สมมติว่าเรารู้ว่าตัวอักษรที่ดัชนี n เป็นตัวเลข)

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

//result: x = 5

(ไร้ประโยชน์ที่จะบอกว่ามันเป็นเพียงตัวอย่าง)

คำตอบ:


444

ลองCharacter.getNumericValue(char)ดู

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

ผลิต:

x=5

สิ่งที่ดีเกี่ยวกับgetNumericValue(char)ก็คือมันยังทำงานร่วมกับสายเช่น"el٥"และ"el५"ที่ไหน٥และเป็นตัวเลข 5 ในภาษาอาหรับตะวันออกและภาษาฮินดี / ภาษาสันสกฤตตามลำดับ


62

ลองทำสิ่งต่อไปนี้:

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

หากคุณลบด้วยถ่าน '0' ค่า ASCII ไม่จำเป็นต้องรู้


1
เหตุผลเกี่ยวกับเรื่องนั้นคืออะไร? ผลลัพธ์คือ substraction ระหว่าง '0' ใน ASCI และ char ใน asci ???
Ignacio chiazzo

10
@msj เนื่องจากค่าของ'0', '1', '2', ...in ascii กำลังเพิ่มขึ้น ดังนั้นเช่น '0' ใน ASCII คือ 48, '1' 49 ฯลฯ ดังนั้นถ้าคุณใช้จริงๆเพียงแค่คุณได้รับ'2' - '0' 50 - 48 = 2ดูตาราง ASCII เพื่อทำความเข้าใจหลักการนี้ดีขึ้น นอกจากนี้ยัง'x'หมายถึงรับค่า ascii ของตัวละครใน Java
Kevin Van Ryckegem

1
@KevinVanRyckegem ขอบคุณ! ฉันกำลังมองหาว่าทำไม- '0'ทำงาน ... ฉันคิดว่ามันเป็นเวทย์มนตร์ลึก ๆ ในวิธีที่ Java ตีความตัวอักษรหรืออะไรก็ตาม ... นี่เป็นกรณีของฉันที่ซับซ้อนมากกว่าบางสิ่งบางอย่าง ...
scoots

แม้ว่านี่จะเป็นเคล็ดลับที่เรียบร้อย แต่ก็สามารถอ่านได้น้อยกว่าการใช้Character.getNumericValue
Janac Meena

33

นั่นอาจจะเป็นสิ่งที่ดีที่สุดจากมุมมองด้านประสิทธิภาพ แต่ก็หยาบ:

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

มันทำงานได้ถ้าคุณคิดว่าตัวละครของคุณเป็นตัวเลขและมีเพียงภาษาที่ใช้ Unicode เช่น Java ...


7
ลองใช้กับสตริง"el५"ที่เป็นเลข 5 ในอินเดีย :)
Bart Kiers

3
ฉันแน่ใจว่าคุณทำงานอย่างหนักเพื่อหาตัวอย่างนี้ ... :-) ตกลงถ้าคุณต้องแยกตัวเลขที่ไม่ใช่ภาษาอาหรับให้หลีกเลี่ยงวิธีนี้ อย่างที่ฉันพูดมันหยาบกร้าน แต่มันก็ยังคงเป็นวิธีที่เร็วที่สุดใน 99.999% ของกรณีที่ใช้งานได้
Alexis Dufrenoy

@AlexisDufrenoy เหตุใดจึงควรลบอักขระ'0'คืนค่าจำนวนเต็ม
Istiaque Ahmed

1
ดูค่าจากตาราง ASCII ถ่าน '9' = int 57, ถ่าน '0' = int 48, ผลลัพธ์นี้ใน '9' - '0' = 57 - 48 = 9
WHDeveloper

1
ทำงานเหมือนจับใจ lol @ counterexample และชาวอินเดียทั้งหมดที่คัดลอกคำตอบของคุณ ประชด
ทุก

16

เพียงลบด้วยถ่าน '0' (ศูนย์) ถ่าน (ตัวเลข '0' ถึง '9') สามารถแปลงเป็น int (0 ถึง 9) เช่น '5' - '0' ให้ 5 int

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

ใช้ไบนารีANDกับ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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.