Dlaczego Apache Commons traktuje numer „numer”?


101

Zgodnie z dokumentacją Apache Commons Lang dla StringUtils.isNumeric(), ciąg „१२३” jest numeryczny.

Ponieważ uważałem, że to może być błąd w dokumentacji, przeprowadziłem testy, aby zweryfikować oświadczenie. Odkryłem, że według Apache Commons jest to numeryczny.

Dlaczego ten ciąg jest numeryczny? Co reprezentują te postacie?


61
Być może reprezentują cyfry w jakimś języku. Nie wszystkie języki używają symboli od 0 do 9 do reprezentowania cyfr.
Eran

165
są to 1, 2 i 3 w języku hindi
Blip

11
Możesz uzyskać wartość całkowitą przez Integer.parseInt("१२३").
saka1029

9
@ dan04 To nie są liczby, to są popularne litery, które reprezentują określone stałe. Zwróć uwagę na różnicę między ⅯⅭi MC.
gerrit

Odpowiedzi:


198

Ponieważ „CharSequence zawiera tylko cyfry Unicode” (cytując połączoną dokumentację ).

Wszystkie znaki zwracają prawdę dla Character.isDigit:

Niektóre zakresy znaków Unicode zawierające cyfry:

  • „\ u0030” do „\ u0039”, cyfry ISO-LATIN-1 (od „0” do „9”)
  • „\ u0660” do „\ u0669”, cyfry arabsko-indyjskie
  • „\ u06F0” do „\ u06F9”, rozszerzone cyfry arabsko-indyjskie
  • „\ u0966” do „\ u096F”, cyfry dewanagari
  • „\ uFF10” do „\ uFF19”, cyfry o pełnej szerokości

Wiele innych zakresów znaków również zawiera cyfry.

१२३ to cyfry dewanagari:


11
@Joker_vD dobrze, nie zostały określone, które przeciążenie, więc tak, że: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD To nawet nie jest trudne; istnieje wiele nieobsługiwanych języków. Nawet jeśli tak, istnieje Chinise 亿, który reprezentuje 10 ^ 8 -> to do potęgi 3 spowodowałoby przepełnienie. Lista systemów liczbowych
Cedric Reichenbach

13
@CedricReichenbach: Kluczową różnicą jest to, że chociaż 亿 jest numeryczne (zgodnie ze standardami posiadania jednej z wartości typu Numeric_Type, w tym przypadku Numeric_Type = Numeric), nie jest to żadna cyfra . (Nawet gdyby tak było, nie wziąłbyś tego do potęgi 3; podniósłbyś podstawę do różnych potęg, a nie cyfr .) parseIntWymaga cyfr i być może myląco, isNumericmetoda w tym pytaniu testuje znaki cyfr dziesiętnych ( General_Category = Decimal_Number) zamiast dowolnej szerszej kategorii znaków numerycznych.
user2357112 obsługuje Monikę

10
Kompletny zestaw cyfr Devangari to ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) zapytał, czy istnieje sposób, aby uzyskać Integer.parseInt()wyjątek dla 3-znakowego numerycznego ciągu wejściowego.
Andy Turner

59

Symbol १२३ jest taki sam jak 123 dla języka nepalskiego lub dowolnego innego języka używającego pisma dewanagari, takiego jak hindi, gudżarati itd., I dlatego jest liczbą dla Apache Commons.


3
Ta rzecz wygląda prawie jak „123” w cyfrach arabskich.
Panzercrisis

41
Arabowie otrzymali swoje cyfry od Indian.

5
@rahul Arabskie cyfry to 1-9, a nie ١-٩, jak się powszechnie uważa.
Maroun

26

Możesz użyć, Character#getTypeaby sprawdzić ogólną kategorię postaci:

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

Zostanie wydrukowane true, co jest „dowodem” na to, że „'” jest liczbą cyfrową .

Przyjrzyjmy się teraz wartości Unicode znaku „१”:

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

Ta liczba mieści się w zakresie cyfr dewanagari - czyli: \u0966do \u096F.

Spróbuj także:

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

Devanagari to:

jest alfabetem abugida (alfabetycznym) z Indii i Nepalu

„१२३” to „123” (kod Unicode z łaciny podstawowej).

Czytanie:


1
Bardziej znaczące jest to, że są typowe, DECIMAL_DIGIT_NUMBERniż to, że są w DEVANAGARIbloku. W tym bloku znajdują się również litery niecyfrowe.
Andy Turner

23

Jeśli kiedykolwiek chcesz wiedzieć, jakie właściwości ma dany „znak” (a jest ich całkiem sporo), przejdź bezpośrednio do źródła: Unicode.org . Mają narzędzia badawcze, które mogą pokazać ci wszystko, co chciałbyś wiedzieć.

PAMIĘTAJ: Konsorcjum Unicode tworzy specyfikację, a nie oprogramowanie. Oznacza to, że do każdego dostawcy oprogramowania należy jak najdokładniejsze wdrożenie specyfikacji . Podobnie jak w przypadku HTML, JavaScript, CSS, SQL itp., Istnieją różnice między różnymi platformami, językami i tak dalej. Na przykład znalazłem błąd w platformie Microsoft .NET Framework, w wyniku którego zakreślone łacińskie litery A-Zoraz a-z- punkty kodowe od 0x24B6 do 0x24E9 - nie są poprawnie rejestrowane jako istnienie char.IsLetter = true( raport o błędzie tutaj ). A to prowadzi do nieoczekiwanego zachowania w powiązanej funkcjonalności, na przykład podczas wywoływania TextInfo.ToTitleCase()metody ( raport o błędzie tutaj ).


1
Świetne referencje! (Chociaż sprawiają, że zastanawiam się, czy Unicode przeszedł na szczyt!)
PJTraill

1
Jeśli chcesz mieć tego rodzaju odniesienia dostępne lokalnie, możesz zainstalować uniprops .
TRiG

2
@TRiG Dzięki za wspomnienie o tym. Ciekawe narzędzie. Obejmuje niektóre funkcje pokazane w pierwszych 3 linkach (oryginalny zestaw), ale właśnie zaktualizowałem moją odpowiedź, aby zawierała dodatkowe linki, które pokazują bardziej zaawansowane zapytania, które można wykonać na Unicode.org, których nie widzę jako możliwe via uniprops. Wydaje się również, że unipropsjest jedna wersja w tyle, ponieważ Unicode wydała wersję 9.0 w czerwcu ubiegłego roku.
Solomon Rutzky

19

Symbole „१२३” pochodzą w rzeczywistości z języka hindi (zasadniczo z języka sanskrytu, tj. Dewanagiri), które reprezentują wartości liczbowe, tak jak:

१ reprezentują 1

२ reprezentują 2

I podobnie


4
KOREKTA: Symbole „123” są rzeczywiście pochodzi od sanskryckiego języku (tzn skrypt Devanagiri jak inne plakaty zauważyli)
Happy Green Kid KPD

Byłem zaskoczony, gdy dowiedziałem się, jak niedawno Devanāgarī przybrało swoją obecną formę - wiele wieków po skodyfikowaniu sanskrytu! Jestem więc sceptyczny co do twierdzenia, że ​​cyfry należą bardziej do sanskrytu niż ogólnie do kultury indyjskiej.
Anton Sherwood,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.