Почему Apache Commons считает '१२३' числовым?


101

Согласно документации Apache Commons Lang для StringUtils.isNumeric(), строка '' является числовой.

Поскольку я считал, что это могло быть ошибкой в ​​документации, я провел тесты, чтобы проверить утверждение. Я обнаружил , что в соответствии с Apache Commons он является числовым.

Почему эта строка числовая? Что представляют собой эти персонажи?


61
Возможно, они представляют собой цифры на каком-то языке. Не все языки используют символы от 0 до 9 для обозначения цифр.
Эран

165
это 1, 2 и 3 на хинди
Blip

11
Вы можете получить целочисленное значение с помощью Integer.parseInt("१२३").
saka1029

9
@ dan04 Это не числа, это буквы, которые обычно используются для обозначения определенных констант. Обратите внимание на разницу между ⅯⅭи MC.
gerrit

Ответы:


198

Потому что этот «CharSequence содержит только цифры Unicode» (цитирую вашу связанную документацию ).

Все символы возвращают истину для Character.isDigit:

Некоторые диапазоны символов Юникода, содержащие цифры:

  • '\ u0030' - '\ u0039', цифры ISO-LATIN-1 (от '0' до '9')
  • от '\ u0660' до '\ u0669', арабско-индийские цифры
  • '\ u06F0' - '\ u06F9', расширенные арабско-индийские цифры
  • '\ u0966' - '\ u096F', цифры деванагари
  • от '\ uFF10' до '\ uFF19', цифры полной ширины

Многие другие диапазоны символов также содержат цифры.

१२३ цифры Деванагари:


11
@Joker_vD хорошо, вы не указаны , которые перегрузка, да так, что: Integer.parseInt("222", 2).
Энди Тернер,

4
@Joker_vD Это даже не сложно; есть много неподдерживаемых языков. Даже если это так, есть Chinise 亿, который представляет 10 ^ 8 -> это в степени 3 вызовет переполнение. Список систем счисления
Седрик Райхенбах

13
@CedricReichenbach: ключевое различие заключается в том, что, хотя 亿 является числовым (по стандартам наличия одного из ненулевых значений Numeric_Type, в данном случае Numeric_Type = Numeric), это не какая-либо цифра . (Даже если бы это было так, вы бы не стали доводить это до степени 3; вы бы возводили систему счисления в различные степени, а не цифры .) parseIntТребуются цифры, и, возможно, сбивает с толку, isNumericметод в этом вопросе проверяет символы десятичных цифр ( General_Category = Decimal_Number) вместо любой более широкой категории числовых символов.
user2357112 поддерживает Монику

10
Полный набор цифр Девангари есть ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) он спросил, есть ли способ вызвать Integer.parseInt()исключение для трехзначной числовой входной строки.
Энди Тернер

59

Символ १२३ такой же, как 123 для непальского языка или любого другого языка, использующего сценарий деванагари, такого как хинди, гуджарати и т. Д., И поэтому является числом для Apache Commons.


3
Эта штука выглядит как цифра 123 арабскими цифрами.
Panzercrisis

41
Арабы получили свои цифры от индейцев.

5
@rahul Арабские числа от 1 до 9, а не ١-٩, как принято считать.
Maroun

26

Вы можете использовать Character#getTypeдля проверки общей категории персонажа:

System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));

Будет напечатано true, что является «доказательством» того, что '१' - это цифровое число .

Теперь давайте рассмотрим значение Unicode символа '१':

System.out.println(Integer.toHexString('१'));
// 967

Это число находится в диапазоне цифр Деванагари, то есть до \u0966конца \u096F.

Также попробуйте:

Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI

Деванагари :

алфавит абугида (алфавитный алфавит) Индии и Непала

«१२३» - это «123» (основной латинский юникод).

Чтение:


1
Более важно то, что они принадлежат к типу, DECIMAL_DIGIT_NUMBERчем то, что они находятся в DEVANAGARIблоке. В этом блоке тоже есть нецифровые буквы.
Энди Тернер,

23

Если вы когда-нибудь захотите узнать, какими свойствами обладает тот или иной «персонаж» (а их довольно много), перейдите непосредственно к источнику: Unicode.org . У них есть исследовательские инструменты, которые могут показать вам почти все, что вам интересно.

ВНИМАНИЕ: Консорциум Unicode производит спецификацию, а не программное обеспечение. Это означает, что каждый поставщик программного обеспечения должен реализовать спецификацию как можно точнее . Так же, как HTML, JavaScript, CSS, SQL и т. Д., Существуют различия между разными платформами, языками и т. Д. Например, я обнаружил ошибку в Microsoft .NET Framework, в которой обведены латинские буквы A-Zи a-z- кодовые точки от 0x24B6 до 0x24E9 - не регистрируются должным образом как существующие char.IsLetter = true( отчет об ошибке здесь ). И это приводит к неожиданному поведению связанных функций, например, при вызове TextInfo.ToTitleCase()метода ( отчет об ошибке здесь ).


1
Отличные ссылки! (Хотя они заставляют меня задуматься, не переборщил ли Unicode!)
PJTraill

1
Если вы хотите, чтобы такие ссылки были доступны локально, вы можете установить uniprops .
TRiG

2
@TRiG Спасибо, что упомянули об этом. Интересная утилита. Он охватывает некоторые функции, показанные в первых трех ссылках (исходный набор), но я только что обновил свой ответ, включив в него некоторые дополнительные ссылки, которые показывают более сложные запросы, которые можно выполнить на Unicode.org, которые я не вижу возможными. через uniprops. Кроме того, похоже, что unipropsэто одна версия позади, поскольку Unicode выпустил версию 9.0 в июне этого года.
Соломон Рутцки

19

Символы '१२३' на самом деле получены из языка хинди (в основном из санскрита, т.е. деванагири), которые представляют числовые значения, например:

१ представляют 1

२ представляют 2

и как мудрый


4
ИСПРАВЛЕНИЕ: Символы «123» на самом деле происходит от санскритского языка (т.е. Devanagiri сценарий , как и другие плакаты отметили)
Счастливый зеленый Kid Дремоты

Я был удивлен, узнав, как недавно деванагари принял свою нынешнюю форму - спустя много веков после того, как санскрит был кодифицирован! Поэтому я скептически отношусь к утверждению, что цифры больше относятся к санскриту, чем к индийской культуре в целом.
Антон Шервуд,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.