Mengapa Apache Commons menganggap '१२३' numerik?


101

Menurut dokumentasi Apache Commons Lang untuk StringUtils.isNumeric(), String '१२३' adalah numerik.

Karena saya yakin ini mungkin kesalahan dalam dokumentasi, saya menjalankan tes untuk memverifikasi pernyataan tersebut. Saya menemukan bahwa menurut Apache Commons itu adalah numerik.

Mengapa String ini numerik? Apa yang diwakili oleh karakter tersebut?


61
Mungkin mereka mewakili angka dalam beberapa bahasa. Tidak semua bahasa menggunakan simbol 0 hingga 9 untuk mewakili angka.
Eran

165
ini adalah 1, 2 dan 3 di hindi
Blip

11
Anda bisa mendapatkan nilai integer dengan Integer.parseInt("१२३").
saka1029

9
@ dan04 Itu bukan angka, itu adalah huruf yang populer untuk mewakili konstanta tertentu. Perhatikan perbedaan antara ⅯⅭdan MC.
gerrit

Jawaban:


198

Karena "CharSequence hanya berisi digit Unicode" (mengutip dokumentasi tertaut Anda ).

Semua karakter kembali benar untuk Character.isDigit:

Beberapa rentang karakter Unicode yang berisi angka:

  • '\ u0030' sampai '\ u0039', ISO-LATIN-1 digit ('0' sampai '9')
  • '\ u0660' sampai '\ u0669', angka Arab-India
  • '\ u06F0' sampai '\ u06F9', digit Arab-India diperpanjang
  • '\ u0966' sampai '\ u096F', angka Dewanagari
  • '\ uFF10' sampai '\ uFF19', Digit lebar penuh

Banyak rentang karakter lain juga mengandung angka.

१२३ adalah angka Devanagari:


11
@Joker_vD baik, Anda tidak ditentukan yang overload, jadi ya, pasti: Integer.parseInt("222", 2).
Andy Turner

4
@JokervD Ini bahkan tidak sulit; ada banyak bahasa yang tidak didukung. Meskipun demikian, ada Chinise 亿, yang mewakili 10 ^ 8 -> ini dengan pangkat 3 akan menyebabkan overflow. Daftar sistem angka
Cedric Reichenbach

13
@CedricReichenbach: Perbedaan utamanya adalah bahwa meskipun 亿 adalah numerik (menurut standar memiliki salah satu nilai non-None dari Numeric_Type, dalam hal ini Numeric_Type = Numeric), ini bukan digit apa pun . (Bahkan jika ya, Anda tidak akan membawanya ke pangkat 3; Anda akan menaikkan radix ke berbagai pangkat , bukan digit .) parseIntMemerlukan digit, dan mungkin membingungkan, isNumericmetode dalam pertanyaan ini menguji karakter digit desimal ( General_Category = Decimal_Number) daripada kategori karakter numerik yang lebih luas.
user2357112 mendukung Monica

10
Angka Devangari yang lengkap adalah ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) dia bertanya apakah ada cara untuk membuat Integer.parseInt()pengecualian untuk string input numerik 3 karakter.
Andy Turner

59

Simbol १२३ sama dengan 123 untuk bahasa Nepal atau bahasa lain yang menggunakan aksara Dewanagari seperti Hindi, Gujarati, dan seterusnya, dan oleh karena itu merupakan angka untuk Apache Commons.


3
Benda itu hampir terlihat seperti "123" dalam angka Arab.
Panzercrisis

41
Orang Arab mendapatkan angka mereka dari orang India.

5
@rahul angka arab adalah 1-9, bukan ١-٩ seperti yang disangka.
Maroun

26

Anda dapat menggunakan Character#getTypeuntuk memeriksa kategori umum karakter:

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

Ini akan mencetak true, yang merupakan "bukti" bahwa '१' adalah angka digit .

Sekarang mari kita periksa nilai unicode dari karakter '१':

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

Nomor ini ada di kisaran digit Dewanagari - yaitu: \u0966lewat \u096F.

Juga coba:

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

Dewanagari adalah:

adalah alfabet abugida (alfasyllabary) dari India dan Nepal

"१२३" adalah "123" (Unicode Latin Dasar).

Bacaan:


1
Lebih penting bahwa mereka adalah tipe DECIMAL_DIGIT_NUMBERdaripada mereka di DEVANAGARIblok. Ada juga huruf non-digit di blok itu.
Andy Turner

23

Jika Anda ingin mengetahui properti apa yang dimiliki "karakter" tertentu (dan ada beberapa), buka langsung sumbernya: Unicode.org . Mereka memiliki alat penelitian yang dapat menunjukkan kepada Anda hampir semua hal yang ingin Anda ketahui.

PERHATIAN: Unicode Consortium menghasilkan spesifikasi, bukan perangkat lunak. Artinya, terserah setiap vendor perangkat lunak untuk mengimplementasikan spesifikasi seakurat mungkin . Jadi seperti HTML, JavaScript, CSS, SQL, dll, ada variasi antara berbagai platform, bahasa, dan sebagainya. Misalnya, saya menemukan bug di .NET Framework Microsoft yang melingkari huruf Latin A-Zdan a-z- Poin Kode 0x24B6 hingga 0x24E9 - tidak terdaftar dengan benar char.IsLetter = true( laporan bug di sini ). Dan itu mengarah pada perilaku tak terduga dalam fungsionalitas terkait, seperti saat memanggil TextInfo.ToTitleCase()metode ( laporan bug di sini ).


1
Referensi yang bagus! (Meskipun mereka membuat saya bertanya-tanya apakah Unicode telah melampaui batas!)
PJTraill

1
Jika Anda ingin referensi semacam ini tersedia secara lokal, Anda dapat menginstal uniprops .
TRiG

2
@TRiG Terima kasih telah menyebutkannya. Utilitas yang menarik. Itu memang mencakup beberapa fungsi yang ditunjukkan dalam 3 tautan pertama (set asli), tetapi saya baru saja memperbarui jawaban saya untuk menyertakan beberapa tautan tambahan yang menunjukkan pertanyaan lebih lanjut yang dapat dilakukan di Unicode.org yang saya tidak melihat mungkin melalui uniprops. Juga, tampaknya itu unipropsadalah satu versi di belakang karena Unicode merilis versi 9.0 Juni lalu.
Solomon Rutzky

19

Simbol '१२३' sebenarnya berasal dari bahasa Hindi (Pada dasarnya dari bahasa Sansekerta yaitu Devanagiri) yang merepresentasikan nilai numerik seperti:

१ mewakili 1

२ mewakili 2

dan suka bijaksana


4
KOREKSI: Simbol '१२३' sebenarnya berasal dari bahasa Sanskerta (yaitu, aksara Devanagiri seperti yang dicatat poster lain)
Happy Green Kid Naps

Saya terkejut mengetahui betapa baru-baru ini Devanāgarī mengambil bentuknya yang sekarang - berabad-abad setelah bahasa Sansekerta dikodifikasi! Jadi saya skeptis dengan klaim bahwa angka-angka itu lebih milik Sanskerta daripada budaya India pada umumnya.
Anton Sherwood
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.