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

Ali*_*Ali 7 java android numberformatexception arabic-support

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

我怎样才能解析这样的数字?

我在 android 环境中工作;

Eng*_*uad 6

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

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);
Run Code Online (Sandbox Code Playgroud)

输出:

1.5
Run Code Online (Sandbox Code Playgroud)

  • 在我的例子中 Locale.getDefault() 与 EASTERN_ARABIC_NUMBERS_LOCALE 相同 (3认同)

小智 5

回答

\n

不Float.valueOf("\xdb\xb1")检查不同的语言或字符,它只检查数字0-9。Integer.valueOf使用Character.digit()获取字符串中每个数字的值。

\n

研究/解释

\n

我用 Intellij 调试器调试了该语句Float.valueOf("\xdb\xb1")。如果您深入研究 FloatingDecimal.java,您会发现以下代码确定应将哪个字符计为数字:

\n
  digitLoop:\n        while (i < len) {\n            c = in.charAt(i);\n            if (c >= \'1\' && c <= \'9\') {\n                digits[nDigits++] = c;\n                nTrailZero = 0;\n            } else if (c == \'0\') {\n                digits[nDigits++] = c;\n                nTrailZero++;\n            } else if (c == \'.\') {\n                if (decSeen) {\n                    // already saw one ., this is the 2nd.\n                    throw new NumberFormatException("multiple points");\n                }\n                decPt = i;\n                if (signSeen) {\n                    decPt -= 1;\n                }\n                decSeen = true;\n            } else {\n                break digitLoop;\n            }\n            i++;\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,没有检查不同的语言,它只检查数字0-9。

\n

在逐步执行的同时Integer.valueOf,

\n

public static int parseInt(String s, int radix)

\n

使用s = "\xdb\xb1"和执行radix = 10。

\n

然后调用 parseInt 方法Character.digit(\'\xdb\xb1\',10)来获取 的数字值1。

\n

参见Character.digit()

\n