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;

якщо u відняти знак char '0', значення ASCII не повинно бути відомим.


1
У чому причина цього? результат - субстракція між "0" в ASCI і знаком в asci ???
ignacio chiazzo

10
@msj Оскільки значення '0', '1', '2', ...в ascii зростають . Так, наприклад, "0" в ascii - 48, "1" - 49, і т.д. Так, якщо ви візьмете, '2' - '0'ви дійсно просто отримаєте 50 - 48 = 2. Погляньте на таблицю ASCII, щоб краще зрозуміти цей принцип. Крім того, 'x'засоби отримують значення ascii символу на Java.
Кевін Ван Ріккегем

1
@KevinVanRyckegem дякую! Я шукав, навіщо - '0'працював ... Я думав, що це якась глибока магія в тому, як Ява інтерпретувала символи чи що завгодно ... це справді було справою мене над тим, щоб щось ускладнити ...
скористується

Хоча це акуратний трюк, він менш читабельний, ніж використанняCharacter.getNumericValue
Janac Meena

33

Це, мабуть, найкраще з точки зору продуктивності, але це грубо:

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

Це працює, якщо ви вважаєте, що ваш персонаж є цифрою, і лише в мовах, які завжди використовують Unicode, як Java ...


7
Спробуйте це з рядком, "el५"де цифра 5 в Індії. :)
Барт Кіерс

3
Я впевнений, що ви наполегливо працювали, щоб знайти цей приклад ... :-) Добре, якщо вам доведеться розбирати неарабські цифри, уникайте цього методу. Як я вже казав, це грубо. Але це все-таки найшвидший метод у 99,999% випадків, коли він працює.
Олексій Дуфреной

@AlexisDufrenoy, чому слід віднімання символу '0'повертати ціле число?
Істіак Ахмед

1
Подивіться на значення таблиці ASCII char '9' = int 57, char '0' = int 48, це призводить до '9' - '0' = 57 - 48 = 9
WHDeveloper

1
працює як шарм. lol @ counterterexample та всі індіанці, які скопіювали вашу відповідь. іронія.
omikes

16

Просто віднімаючи символом "0" (нуль), знак char (з цифри "0" до "9") може бути перетворений в int (0 до 9), наприклад, "5" - "0" дає 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

Використання двійкового 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

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

Відняття значення ascii '0' = 48 з char

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.