为什么Apache Commons认为数字是“ १२३”?


101

根据Apache Commons Lang的文档StringUtils.isNumeric(),字符串'१२३'是数字。

由于我认为这可能是文档中的错误,因此我进行了测试以验证该声明。我发现根据Apache Commons,它数字。

为什么这个字符串是数字的?这些字符代表什么?


61
也许它们代表某种语言的数字。并非所有的语言都使用0到9符号来表示数字。
伊兰

165
这些是印地语中的1、2和3
Blip

11
您可以通过获取整数值Integer.parseInt("१२३")
saka1029

9
@ dan04不是数字,而是流行的代表特定常量的字母。注意之间的差异ⅯⅭMC
Gerrit '16

Answers:


198

因为该“ CharSequence仅包含Unicode数字”(引用链接的文档)。

所有字符对于Character.isDigit以下字符均返回true :

某些包含数字的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甚至都不难;有许多不受支持的语言。即使是这样,也有Chinise 亿,它表示10 ^ 8-> 3的幂会导致溢出。数字系统列表
Cedric Reichenbach

13
@CedricReichenbach:关键区别在于,亿是数字(按具有Numeric_Type的非值之一,在这种情况下为Numeric_Type = Numeric的标准),它不是任何数字。(即使是,也不会将其乘以 3的幂;您会将基数提高到各种幂,而不是数字。)parseInt需要数字,并且可能令人困惑的是,isNumeric此问题中的方法测试十进制数字字符( General_Category = Decimal_Number),而不是任何更大范围的数字字符。
user2357112支持Monica

10
Devangari数字的完整集合是०१२३४५६७८९
dan04 '16

2
@ v7d8dpo4(s)他询问是否有一种方法可以Integer.parseInt()引发3个字符的数字输入字符串的异常。
安迪·特纳

59

१२३符号与尼泊尔语或使用梵文脚本的其他任何语言(如印地语,古吉拉特语等)的123相同,因此对于Apache Commons是一个数字。


3
那东西几乎看起来像阿拉伯数字中的“ 123”。
Panzercrisis

41
阿拉伯人从印第安人那里得到数字。

5
@rahul阿拉伯数字为1-9,而不是通常认为的١-٩。
Maroun

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

梵文是:

是印度和尼泊尔的abugida(alphasyllabary)字母

“ १२३”是“ 123”(基本拉丁语unicode)。

读:


1
它们的类型DECIMAL_DIGIT_NUMBERDEVANAGARI块中的类型更重要。该块中也有非数字字母。
安迪·特纳

23

如果您想知道特定“字符”具有哪些属性(并且有很多),请直接转到源:Unicode.org。他们拥有研究工具,可以为您显示您最想知道的所有信息。

谨记: Unicode联盟制定规范而不是软件。这意味着要由每个软件供应商来尽可能准确地实施规范。因此,就像HTML,JavaScript,CSS,SQL等一样,不同的平台,语言等之间也存在差异。例如,我在Microsoft .NET Framework中发现了一个错误,该错误中带圆圈的拉丁字母A-Za-z-代码点0x24B6至0x24E9-未正确注册为char.IsLetter = true这里的错误报告)。这会导致相关功能发生意外行为,例如调用该TextInfo.ToTitleCase()方法时(此处为bug报告)。


1
很好的参考!(尽管它们的确使我怀疑Unicode是否已经超越了!)
PJTraill

1
如果要在本地使用这种参考,可以安装uniprops
TRiG

2
@TRiG感谢您提及。有趣的实用程序。它确实涵盖了前3个链接(原始设置)中显示的某些功能,但是我刚刚更新了答案,以包括一些其他链接,这些链接显示了可以在Unicode.org上完成的更高级的查询,但我认为这不可能通过uniprops。而且,似乎uniprops比今年6月Unicode发布的9.0版本落后一个版本。
所罗门·鲁茨基

19

符号“ १२३”实际上源自印地语(基本上来自梵语,即梵文),其表示数值的方式类似于:

१代表1

२代表2

和明智的


4
更正:符号“123”实际上是源于 梵语 语言(即Devanagiri脚本其他海报指出)
快乐儿童绿色小睡

我很惊讶地得知Devanāgarī最近如何发展成现在的形式-梵语被编纂了多个世纪!因此,我对数字总体上属于梵语而不是印度文化的说法表示怀疑。
安东·谢伍德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.