使用阿拉伯数字Integer.valueOf("۱")
返回整数1,但是Float.valueOf("۱")
或Float.parseFloat("۱")
抛出NumberFormatException
,但是如果您使用英语数字Float.valueOf("1")
,则不会抛出任何异常,这是Java中的错误还是有一些解释? ?
如何解析这样的数字?
我正在android环境中工作;
Locale EASTERN_ARABIC_NUMBERS_LOCALE = new Locale.Builder()
.setLanguage("ar")
.setExtension('u', "nu-arab")
.build();
float f = NumberFormat.getInstance(EASTERN_ARABIC_NUMBERS_LOCALE)
.parse("۱٫۵")
.floatValue();
System.out.println(f);
的规格说:
忽略s中的前导和尾随空白字符。空格被String.trim()方法删除;也就是说,两者ASCII空格和控制字符被删除。的其余部分应构成FloatValue,如词汇语法规则所述:
1.5
最接近您的词法规则是Float.valueOf(String)
,它由一个可选符号组成,然后是Float.valueOf(String)
,它只能是FloatValue:
Signopt NaN
Signopt Infinity
Signopt FloatingPointLiteral
Signopt HexFloatingPointLiteral
SignedInteger
...
。
SignedInteger
[另一方面,SignedInteger
指的是Digits
,它只是说:
字符串中的字符必须全部为十进制数字,但第一个字符可以是ASCII减号
“十进制数字”的范围大于0-9;可以使用Digits
中的任何内容,例如0-9
(无耻插头)。
更确切地说是。
所以,这表现为指定的行为;您是否认为这是正确的规范是另一回事。
在Digits:
Digit
Digit [DigitsAndUnderscores] Digit
Digit:
0
NonZeroDigit
NonZeroDigit:
(one of)
1 2 3 4 5 6 7 8 9
中,不检查其他语言或字符,只检查数字Integer.valueOf(String)
。 Integer.valueOf(String)
使用Integer.parseInt(String)
获取字符串中每个数字的值。
我使用Intellij调试器调试了Integer.parseInt(String)
语句。如果您深入FloatingDecimal.java,则此代码将确定应将哪个字符计为数字:
DECIMAL_DIGIT_NUMBER
如您所见,不检查其他语言,只检查数字DECIMAL_DIGIT_NUMBER
。
[逐步执行"१२३"时,
Float.valueOf("۱")
用0-9
和Integer.valueOf
执行。
parseInt方法然后调用Character.digit()以获取Float.valueOf("۱")
的数字值。
请参见 digitLoop:
while (i < len) {
c = in.charAt(i);
if (c >= '1' && c <= '9') {
digits[nDigits++] = c;
nTrailZero = 0;
} else if (c == '0') {
digits[nDigits++] = c;
nTrailZero++;
} else if (c == '.') {
if (decSeen) {
// already saw one ., this is the 2nd.
throw new NumberFormatException("multiple points");
}
decPt = i;
if (signSeen) {
decPt -= 1;
}
decSeen = true;
} else {
break digitLoop;
}
i++;
}