Почему 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.