Integer.valueOf阿拉伯数字工作正常,但相同数字的Float.valueOf给出NumberFormatException

问题描述 投票:2回答:3

使用阿拉伯数字Integer.valueOf("۱")返回整数1,但是Float.valueOf("۱")Float.parseFloat("۱")抛出NumberFormatException,但是如果您使用英语数字Float.valueOf("1"),则不会抛出任何异常,这是Java中的错误还是有一些解释? ?

如何解析这样的数字?

我正在android环境中工作;

java android numberformatexception arabic-support
3个回答
2
投票

[似乎Float.parseFloat()不支持阿拉伯阿拉伯数字。或者,您可以使用Float.parseFloat()类:

NumberFormat

输出:

NumberFormat

1
投票

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(无耻插头)。

更确切地说是。


所以,这表现为指定的行为;您是否认为这是正确的规范是另一回事。


1
投票

答案

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-9Integer.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++; }

© www.soinside.com 2019 - 2024. All rights reserved.