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.