StringUtils.isNumeric()
に関するApache Commons Langのドキュメントによると、文字列「१२३」は数値です。
これはドキュメントの間違いであると考えたため、テストを実行してステートメントを検証しました。 Apache Commonsによれば、それはis数値であることがわかりました。
なぜこの文字列は数値なのですか?それらのキャラクターは何を表していますか?
その理由は、「CharSequenceにはUnicode数字のみが含まれている」ためです( リンクされたドキュメント を引用)。
Character.isDigit
の場合、すべての文字がtrueを返します。
数字を含むいくつかのUnicode文字範囲:
- 「\ u0030」から「\ u0039」、ISO-LATIN-1の数字(「0」から「9」)
- 「\ u0660」から「\ u0669」、アラビア語-インド数字
- '\ u06F0'〜 '\ u06F9'、拡張アラビア数字
- 「\ u0966」から「\ u096F」、デーバナーガリー数字
- 「\ uFF10」から「\ uFF19」、全角数字
他の多くの文字範囲にも数字が含まれています。
१२३
はデーバナーガリー数字です:
記号१२३は、ネパール語、または Devanagariスクリプト を使用するその他の言語(ヒンディー語、グジャラート語など)の123と同じです。などであり、Apache Commonsの番号です。
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.org 。彼らはあなたが知りたいことのほとんどをあなたに示すことができる研究ツールを持っています。
特定のキャラクターのすべてのプロパティを表示するには、次を試してください。
http://unicode.org/cldr/utility/character.jsp?a=१
または:
「10進数」(つまり、0〜9の数値)として分類されたすべての文字を表示する場合は、次を試してください。
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Decimal:]
(550コードポイント-現在/ Unicode 9.0以降)
「10進数以外の数字」として分類されたすべての文字(分数、丸など)を表示するには、次を試してください。
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Numeric:]
(836コードポイント-現在/ Unicode 9.0以降)
「10進数」(つまり、0〜9の数値)として分類されたすべての文字を表示したい場合、ただしUnicode 6.0(.NETで使用)までのみ、次を試してください。 :
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Decimal:]%26 [:Age = 6.0:]
(420コードポイント-変更しないでください)
「10進数」(つまり、0〜9の数値)として分類されたすべての文字を表示したいが、Unicode 6.0まで(.NETで使用)までのみ、およびBase-Multilingual Planeのみで表示したい場合/補助文字なし(つまり、コードポイント65535以上/ U + 0xFFFF)、次を試してください:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Decimal:]%26 [:Age = 6.0:]%26 [:bmp = Yes:]
(350コードポイント-変更しないでください)
KEEP IN MIND:Unicode Consortiumは、ソフトウェアではなく仕様を作成します。つまり、仕様をできる限り正確に実装するのは各ソフトウェアベンダー次第です。そのため、HTML、JavaScript、CSS、SQLなどと同様に、プラットフォーム、言語などの違いがあります。たとえば、Microsoftの.NET Frameworkで、丸付きのラテン文字A-Z
およびa-z
-0x24B6から0x24E9までのコードポイント-char.IsLetter = true
(- バグレポートはこちら )。そして、それは、TextInfo.ToTitleCase()
メソッドを呼び出すときなど、関連する機能で予期しない動作を引き起こします( バグレポートはこちら )。
記号「१२३」は、実際にはヒンディー語(基本的にはサンスクリット語、つまりDevanagiri)から派生したもので、次のような数値を表します。
१は1を表します
२は2を表します
そして賢明なように