Java: анализировать значение int из символа

223

Я просто хочу знать, есть ли лучшее решение для анализа числа из символа в строке (при условии, что мы знаем, что символ в индексе n является числом).

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

//result: x = 5

(бесполезно говорить, что это всего лишь пример)

Noya
источник

Ответы:

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;

если вычесть значение char '0', значение ASCII не нужно знать.

vashishatashu
источник
1
В чем причина этого? результат - вычитание между '0' в ASCI и символом в asci ???
Игнасио Кьяццо
10
@msj Потому что значения '0', '1', '2', ...в ascii возрастают. Так , например , «0» в кодировке ASCII является 48, «1» 49, и т.д. Так что если вы берете '2' - '0'вы на самом деле просто получить 50 - 48 = 2. Посмотрите на таблицу ASCII, чтобы лучше понять этот принцип. Кроме того, 'x'означает получить значение ascii символа в Java.
Кевин Ван Рикегем
1
@KevinVanRyckegem спасибо! Я искал, почему - '0'работал ... Я думал, что это было какое-то глубокое волшебство в том, как Java интерпретирует символы или что-то в этом роде ... Это действительно был случай, когда я что-то усложнил ...
scoots
Хотя это хитрый трюк, он менее Character.getNumericValue
читабелен,
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 @ counterexample и все индусы, которые скопировали ваш ответ. Ирония.
omikes
16

Просто вычитая из char '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

Саурабх
источник