Apache Commonsが「१२३」を数値と見なすのはなぜですか?


101

のApache Commons LangのドキュメントによるとStringUtils.isNumeric()、文字列「१२३」は数値です。

これはドキュメントの間違いかもしれないと思ったので、テストを実行してステートメントを検証しました。Apache Commonsによると、数値であることわかりました。

なぜこの文字列は数値なのですか?それらのキャラクターは何を表していますか?


61
おそらく、それらはいくつかの言語で数字を表します。すべての言語が数字を表すために0〜9の記号を使用するわけではありません。
Eran

165
これらは、ヒンディー語で1、2及び3である
ブリップ

11
整数値はで取得できますInteger.parseInt("१२३")
saka1029

9
@ dan04これらは数字ではなく、特定の定数を表すためによく使用される文字です。違いに注意ⅯⅭしてをMC
2016年

回答:


198

それは、「CharSequenceにはUnicodeの数字のみが含まれている」ため(リンクされたドキュメントを引用)

すべての文字がtrueを返しますCharacter.isDigit

数字を含むいくつかのUnicode文字範囲:

  • '\ 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それは難しいことではありません。サポートされていない言語はたくさんあります。そうだとしても、亿10 ^ 8を表すChinise があります->これは3の累乗でオーバーフローを引き起こします。数値システムのリスト
セドリックライヘンバッハ

13
@CedricReichenbach:キー区別が亿している間ということがある数値(この場合のNumeric_Type =数値で、Numeric_Typeの非なし値の1つを有するの基準で)、それは任意の並べ替えのない数字。(そうであっても、3の累乗にはなりません。基数を、数字ではなく、さまざまな累乗にします。)parseInt数字が必要であり、混乱を招くかもしれませんがisNumeric、この質問のメソッドでは、10進数字文字( General_Category = Decimal_Number)ではなく、より広い範囲の数値文字の代わりに。
user2357112は

10
デバンガリ数字の完全なセットは०१२३४५६७८९です。
dan04

2
@ v7d8dpo4(s)彼はInteger.parseInt()、3文字の数値入力文字列の例外をスローする方法があるかどうか尋ねました。
アンディターナー

59

シンボル123は、ネパールの言語または使用する他の言語の123と同じであるデバナーガリスクリプトをこのようなヒンディー語、グジャラート、としてなど、そのためであるアパッチ・コモンズするための番号です。


3
それはアラビア数字で「123」のように見えます。
Panzercrisis 2016年

41
アラブ人はインディアンから数字を得た。

5
@rahulアラビア数字は1から9で、一般的に考えられている١-٩ではありません。
Maroun 2016年

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」(基本的なラテン語のUnicode)です。

読書:


1
DECIMAL_DIGIT_NUMBERそれらがDEVANAGARIブロック内にあることよりもタイプであることの方が重要です。そのブロックにも数字以外の文字があります。
アンディターナー

23

特定の "文字"が持つプロパティを知りたい場合(そしてかなりの数がある場合)、ソースに直接アクセスしてください:Unicode.org。彼らはあなたが知りたいと思うほとんどすべてを示すことができる研究ツールを持っています。

留意点: Unicodeコンソーシアムは、ソフトウェアではなく仕様を作成します。つまり、仕様をできる限り正確に実装するかどうかは、各ソフトウェアベンダー次第です。したがって、HTML、JavaScript、CSS、SQLなどと同様に、プラットフォーム、言語などによって違いがあります。たとえば、Microsoftの.NET Frameworkに、丸で囲んだラテン文字A-Za-zコードポイント0x24B6から0x24E9までのバグがあることを発見しましたchar.IsLetter = trueバグレポートはこちら)。また、TextInfo.ToTitleCase()メソッドを呼び出すときなど、関連する機能で予期しない動作が発生します(バグレポートはこちら)。


1
素晴らしいリファレンス!(ただし、Unicodeが上を行き過ぎているのかと不思議に思いますが!)
PJTraill

1
この種の参照をローカルで利用できるようにしたい場合は、unipropsをインストールできます。
TRiG 2016年

2
@TRiG言及していただきありがとうございます。興味深いユーティリティ。最初の3つのリンク(元のセット)に示されている機能の一部をカバーしていますが、答えを更新して、Unicode.orgで実行できるより高度なクエリを示すいくつかの追加リンクを追加しました。経由uniprops。また、unipropsこの6月にUnicodeがバージョン9.0をリリースしたため、バージョンが1つ遅れているようです。
ソロモンルツキー

19

記号「१२३」は実際にはヒンディー語(基本的にはサンスクリット語、つまりDevanagiri)から派生しており、次のように数値を表します。

१ 1を表す

२ 2を表す

そして賢いように


4
訂正:記号「१२३」は、実際には サンスクリット から派生しています(つまり、他のポスターが指摘しているように、Devanagiriスクリプト)
Happy Green Kid Naps

最近、デヴァナンガロが現在の形になったのを見て驚いた。サンスクリットが成文化されてから何世紀もたったのだ!したがって、数字がインドの文化一般よりもサンスクリットに属しているという主張には懐疑的です。
アントンシャーウッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.