Чому Apache Commons вважає числом "१२३"?


101

Згідно з документацією Apache Commons Lang для StringUtils.isNumeric()рядка "१२३" є числовим.

Оскільки я вважав, що це може бути помилкою в документації, я провів тести, щоб перевірити твердження. Я виявив, що згідно з Apache Commons він є числовим.

Чому цей рядок числовий? Що представляють ці персонажі?


61
Можливо, вони представляють цифри якоюсь мовою. Не всі мови використовують символи 0 - 9 для представлення цифр.
Еран

165
це 1, 2 і 3 на хінді
Бліп

11
Ви можете отримати ціле значення за допомогою Integer.parseInt("१२३").
saka1029

9
@ dan04 Це не цифри, це букви, які популярно представляти певні константи. Зверніть увагу на різницю між ⅯⅭі MC.
Герріт

Відповіді:


198

Тому що "CharSequence містить лише цифри Unicode" (цитуючи вашу пов'язану документацію ).

Усі символи повертають істину для Character.isDigit:

Деякі діапазони символів Unicode, які містять цифри:

  • '\ u0030' до '\ u0039', цифри ISO-LATIN-1 (від '0' до '9')
  • '\ u0660' через '\ u0669', арабсько-індійські цифри
  • '\ u06F0' через '\ u06F9', розширені арабсько-індійські цифри
  • '\ u0966' через '\ u096F', цифри Devanagari
  • '\ uFF10' через '\ uFF19', цифри повної ширини

Багато інших діапазонів символів також містять цифри.

१२३ - цифри Devanagari:


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()для 3-символьного рядка вводу чисел.
Енді Тернер

59

Символ १२३ такий самий, як 123 для непальської мови або будь-якої іншої мови, використовуючи сценарій Devanagari, такий як хінді, гуджараті тощо, і тому є числом для Apache Commons.


3
Ця річ майже виглядає як "123" в арабських цифрах.
Panzercrisis

41
Араби отримали свої цифри від індіанців.

5
@rahul арабські цифри 1-9, не ١-٩ як прийнято вважати.
Марун

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

Devanagari :

- це алфавіт абагідського (алфавітного) Індії та Непалу

"१२३" - це "123" (базовий латинський унікод).

Читання:


1
Більш важливо, що вони типу, DECIMAL_DIGIT_NUMBERніж те, що вони в DEVANAGARIблоці. У цьому блоці є і безцифрові літери.
Енді Тернер

23

Якщо ви хочете дізнатися, якими властивостями володіє той чи інший "персонаж" (а їх досить багато), перейдіть безпосередньо до джерела: Unicode.org . У них є інструменти дослідження, які можуть показати вам найбільше всього, що ви хотіли б знати.

ПЕРЕГЛЯДУЙТЕ У МІНД: Консорціум Unicode виробляє специфікацію, а не програмне забезпечення. Це означає, що кожен постачальник програмного забезпечення повинен реалізувати специфікацію якомога точніше . Так що, як і HTML, JavaScript, CSS, SQL тощо, існує різниця між різними платформами, мовами тощо. Наприклад, я знайшов помилку в .NET Framework від Microsoft, за допомогою якої обводилися латинські літери 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

Символи "१२३" фактично походять з мови хінді (в основному з санскритської мови, тобто Devanagiri), які представляють числові значення так само:

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

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

і як мудрий


4
КОРЕКЦІЯ: Символи "१२३" фактично походять із санскритської мови (тобто сценарій Devanagiri, як відмітили інші афіші)
Happy Green Kid Naps

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