Apache Commons neden '१२३' harfini sayısal kabul ediyor?


101

Apache Commons Lang'in belgelerine göre StringUtils.isNumeric(), '१२३' Dizesi sayısaldır.

Bunun dokümantasyonda bir hata olabileceğine inandığım için ifadeyi doğrulamak için testler yaptım. Ben Apache Commons göre değerlendirildiği bu olduğunu sayısal.

Bu Dize neden sayısal? Bu karakterler neyi temsil ediyor?


61
Belki bir dilde rakamları temsil ediyorlar. Tüm diller rakamları temsil etmek için 0 - 9 arasındaki sembolleri kullanmaz.
Eran

165
bunlar Hintçe olarak 1, 2 ve 3
Blip

11
Tamsayı değerini şu şekilde alabilirsiniz Integer.parseInt("१२३").
saka1029

9
@ dan04 Bunlar sayı değil, belirli sabitleri temsil etmek için popüler olan harfler. Arasındaki farkı dikkat ⅯⅭve MC.
gerrit

Yanıtlar:


198

Çünkü "CharSequence yalnızca Unicode rakamları içerir" ( bağlantılı belgelerinizden alıntı ).

Tüm karakterler şunun için true değerini döndürür Character.isDigit:

Rakam içeren bazı Unicode karakter aralıkları:

  • "\ u0030" ila "\ u0039", ISO-LATIN-1 basamak ("0" ila "9")
  • "\ u0660" ila "\ u0669", Arapça-Hintçe rakamlar
  • "\ u06F0" ila "\ u06F9", Genişletilmiş Arapça-Hintçe rakamlar
  • "\ u0966" ila "\ u096F", Devanagari rakamları
  • "\ uFF10" ila "\ uFF19", Tam genişlikte basamaklar

Diğer birçok karakter aralığı da rakamlar içerir.

१२३ Devanagari haneleridir:


11
İyi @Joker_vD, sen belirtilmeyen olduğunuz aşırı yük, bu yüzden evet, emin olun: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD Hatta zor değil; desteklenmeyen birçok dil var. Öyle olsa bile, 亿10 ^ 8'i temsil eden Chinise var -> bu 3'ün üssü bir taşmaya neden olur. Sayı sistemleri listesi
Cedric Reichenbach

13
@CedricReichenbach: Buradaki temel ayrım, 亿sayısal iken (Numeric_Type'ın Hiçbiri olmayan değerlerinden birine sahip olma standartlarına göre, bu durumda Numeric_Type = Numeric) herhangi bir rakam değildir . (Öyle olsa bile, 3'ün üssüne götürmezdiniz ; tabanı rakamlara değil, çeşitli kuvvetlere yükseltirdiniz .) parseIntRakam gerektirir ve belki kafa karıştırıcı bir şekilde, isNumericbu sorudaki yöntem ondalık rakam karakterlerini test eder ( General_Category = Ondalık_sayı) daha geniş bir sayısal karakter kategorisi yerine.
user2357112,

10
Devangari basamaklarının tam kümesi ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) Integer.parseInt()3 karakterli bir sayısal girdi dizesi için bir istisna atmanın bir yolu olup olmadığını sordu .
Andy Turner

59

१२३ sembolü Nepal dili için 123 ile aynıdır veya Devanagari alfabesini kullanan Hintçe, Gujarati vb. Diğer diller için aynıdır ve bu nedenle Apache Commons için bir sayıdır.


3
Bu şey Arap rakamlarıyla neredeyse "123" gibi görünüyor.
Panzercrisis

41
Araplar rakamlarını Kızılderililerden aldılar.

5
@rahul Arapça sayılar 1-9'dur, genel olarak düşünüldüğü gibi ١-٩ değildir.
Maroun

26

Character#getTypeKarakterin genel kategorisini kontrol etmek için kullanabilirsiniz :

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

Bu, true'१' harfinin bir rakam olduğunun bir "kanıtı" olan yazdırılacaktır .

Şimdi '१' karakterinin unicode değerini inceleyelim:

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

Bu numara Devanagari basamakları aralığındadır - yani: \u0966üzerinden \u096F.

Ayrıca denemek:

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

Devanagari :

Hindistan ve Nepal'in bir abugida (alfa heceli) alfabesidir

"१२३" bir "123" dür (Temel Latin unicode).

Okuma:


1
Blokta DECIMAL_DIGIT_NUMBERolduklarından daha tip olmaları daha önemlidir DEVANAGARI. Bu blokta rakam olmayan harfler de var.
Andy Turner

23

Belirli bir "karakterin" hangi özelliklere sahip olduğunu bilmek istiyorsanız (ve epeyce var), doğrudan kaynağa gidin: Unicode.org . Bilmek isteyeceğiniz çoğu şeyi size gösterebilecek araştırma araçları var.

DİKKAT EDİN: Unicode Konsorsiyumu, bir yazılım değil, bir şartname üretir. Bu, spesifikasyonu olabildiğince doğru bir şekilde uygulamanın her yazılım satıcısına bağlı olduğu anlamına gelir . Dolayısıyla, HTML, JavaScript, CSS, SQL vb. Gibi, farklı platformlar, diller vb. Arasında farklılıklar vardır. Örneğin, Microsoft'un .NET Framework'ünde Latin harflerini daire içine aldığım A-Zve a-z- 0x24B6'dan 0x24E9'a kadar Kod Noktaları - doğru şekilde kaydedilmediği bir hata buldum char.IsLetter = true( hata raporu burada ). Ve bu, TextInfo.ToTitleCase()yöntemi çağırırken olduğu gibi ilgili işlevsellikte beklenmeyen davranışlara yol açar ( hata raporu burada ).


1
Harika referanslar! (Yine de Unicode'un zirveye
çıkıp çıkmadığını

1
Bu tür bir referansın yerel olarak mevcut olmasını istiyorsanız, uniprops kurabilirsiniz .
TRiG

2
@TRiG Bundan bahsettiğiniz için teşekkürler. İlginç bir yardımcı program. İlk 3 bağlantıda (orijinal küme) gösterilen işlevlerden bazılarını kapsıyor, ancak cevabımı Unicode.org'da yapılabilecek daha gelişmiş sorguları gösteren bazı ek bağlantıları içerecek şekilde güncelledim ve mümkün olmadığını görüyorum. üzerinden uniprops. Ayrıca, unipropsgeçtiğimiz Haziran ayında Unicode'un 9.0 sürümünü yayınladığı için bir sürüm geride kaldı.
Solomon Rutzky

19

Semboller 'Symbol' aslında aşağıdaki gibi sayısal değerleri temsil eden Hintçe dilinden (Temel olarak Sanskrit dilinden yani Devanagiri'den) türetilmiştir:

१ 1'i temsil eder

२ 2'yi temsil eder

Ve aynı şekilde


4
DÜZELTME: '१२३' sembolleri aslında Sanskrit dilinden türetilmiştir (yani, diğer posterlerin de belirttiği gibi Devanagiri alfabesi)
Happy Green Kid Naps

Devanāgarī'nın bugünkü şeklini ne kadar yakın zamanda aldığını öğrenince şaşırdım - Sanskritçe'nin kodlanmasından yüzyıllar sonra! Bu nedenle, rakamların genel olarak Hint kültüründen çok Sanskritçe'ye ait olduğu iddiasına şüpheyle yaklaşıyorum.
Anton Sherwood
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.