根据Apache Commons Lang的文档StringUtils.isNumeric()
,字符串'१२३'是数字。
由于我认为这可能是文档中的错误,因此我进行了测试以验证该声明。我发现根据Apache Commons,它是数字。
为什么这个字符串是数字的?这些字符代表什么?
Integer.parseInt("१२३")
。
ⅯⅭ
和MC
。
根据Apache Commons Lang的文档StringUtils.isNumeric()
,字符串'१२३'是数字。
由于我认为这可能是文档中的错误,因此我进行了测试以验证该声明。我发现根据Apache Commons,它是数字。
为什么这个字符串是数字的?这些字符代表什么?
Integer.parseInt("१२३")
。
ⅯⅭ
和MC
。
Answers:
因为该“ CharSequence仅包含Unicode数字”(引用链接的文档)。
所有字符对于Character.isDigit
以下字符均返回true :
某些包含数字的Unicode字符范围:
- 从'\ u0030'到'\ u0039',ISO-LATIN-1数字(从'0'到'9')
- '\ u0660'至'\ u0669',阿拉伯文-印度数字
- 从'\ u06F0'到'\ u06F9',扩展的阿拉伯文-印度数字
- '\ u0966'至'\ u096F',梵文数字
- '\ uFF10'至'\ uFF19',全角数字
许多其他字符范围也包含数字。
१२३
梵文数字:
Integer.parseInt("222", 2)
。
亿
,它表示10 ^ 8-> 3的幂会导致溢出。数字系统列表
parseInt
需要数字,并且可能令人困惑的是,isNumeric
此问题中的方法测试十进制数字字符( General_Category = Decimal_Number),而不是任何更大范围的数字字符。
०१२३४५६७८९
。
Integer.parseInt()
引发3个字符的数字输入字符串的异常。
१२३符号与尼泊尔语或使用梵文脚本的其他任何语言(如印地语,古吉拉特语等)的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
梵文是:
是印度和尼泊尔的abugida(alphasyllabary)字母
“ १२३”是“ 123”(基本拉丁语unicode)。
读:
DECIMAL_DIGIT_NUMBER
比DEVANAGARI
块中的类型更重要。该块中也有非数字字母。
如果您想知道特定“字符”具有哪些属性(并且有很多),请直接转到源:Unicode.org。他们拥有研究工具,可以为您显示您最想知道的所有信息。
如果要查看特定字符的所有属性,请尝试以下操作:
http://unicode.org/cldr/utility/character.jsp?a=१
要么:
如果要查看所有归类为“十进制数字”的字符(即,数字值为0到9),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Decimal:]
(550个代码点-当前/自Unicode 9.0起)
如果要查看所有归类为“非十进制数字”的字符(即小数,带圆圈等),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Numeric:]
(836个代码点-当前/自Unicode 9.0起)
如果要查看所有归类为“十进制数字”的字符(即,数字值从0到9),但只能看到Unicode 6.0(.NET使用),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Decimal:]%26 [ :Age = 6.0:]
(420个代码点-不应更改)
如果要查看所有归类为“十进制数字”的字符(即,数字值从0到9),但只能查看Unicode 6.0(.NET使用的最多),并且仅在基本多语言平面中/没有补充字符(即高于代码点65535 / U + 0xFFFF),请尝试以下操作:
http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:Numeric_Type = Decimal:]%26 [ :Age = 6.0:]%26 [ :bmp = Yes:]
(350个代码点- -并且不应更改)
谨记: Unicode联盟制定规范而不是软件。这意味着要由每个软件供应商来尽可能准确地实施规范。因此,就像HTML,JavaScript,CSS,SQL等一样,不同的平台,语言等之间也存在差异。例如,我在Microsoft .NET Framework中发现了一个错误,该错误中带圆圈的拉丁字母A-Z
和 a-z
-代码点0x24B6至0x24E9-未正确注册为char.IsLetter = true
(这里的错误报告)。这会导致相关功能发生意外行为,例如调用该TextInfo.ToTitleCase()
方法时(此处为bug报告)。
uniprops
。而且,似乎uniprops
比今年6月Unicode发布的9.0版本落后一个版本。