安卓:西班牙语:解析浮点数值时出现问题:应用程序崩溃

4

Android: Spanish: issue while parsing float value : App crashes Steps:

1.set language as spanish in app

2.format some float value to single decimal

3.parse the formated value to again float

App crashes.

sample code given below:

Please help if you have any idea about this.

 TextView textView = null;
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView) findViewById(R.id.textview);
            float value = 3.456789f;
            setLocale("es", this);//Set App language as Spanish
            String parsedString = String.format("%.1f", value); // format the float value to single precision 
            float parsedValueFloat = Float.parseFloat(parsedString); // parse the value again to float.(APP Crashesh here)
            textView.setText(parsedValueFloat+"");
    }

        public static void setLocale(String languageCode, Context ctx) {
            Locale locale = new Locale(languageCode);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            ctx.getResources().updateConfiguration(config,
                    ctx.getResources().getDisplayMetrics());
        }

Crash logs given below :

 01-06 20:41:00.265: E/AndroidRuntime(3153): java.lang.RuntimeException: Unable to start      activity ComponentInfo{com.example.testcanvas/com.example.testcanvas.MainActivity}: java.lang.NumberFormatException: Invalid float: "3,5"
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.ActivityThread.access$700(ActivityThread.java:159)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.os.Handler.dispatchMessage(Handler.java:99)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.os.Looper.loop(Looper.java:137)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.ActivityThread.main(ActivityThread.java:5419)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at java.lang.reflect.Method.invokeNative(Native Method)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at java.lang.reflect.Method.invoke(Method.java:525)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at dalvik.system.NativeStart.main(Native Method)
            01-06 20:41:00.265: E/AndroidRuntime(3153): Caused by: java.lang.NumberFormatException: Invalid float: "3,5"
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at java.lang.StringToReal.invalidReal(StringToReal.java:63)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at java.lang.StringToReal.parseFloat(StringToReal.java:310)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at java.lang.Float.parseFloat(Float.java:300)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at com.example.testcanvas.MainActivity.onCreate(MainActivity.java:31)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.Activity.performCreate(Activity.java:5372)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257)
            01-06 20:41:00.265: E/AndroidRuntime(3153):     ... 11 more


这只发生在西班牙语中,还是其他语言也会出现? - Al Lelopath
3
我很确定Float.parseFloat()只能识别 . 作为小数点,即它不考虑语言环境。 - Mike M.
Caused by: java.lang.NumberFormatException: Invalid float: "3,5" - Phantômaxx
@mickey 这种情况发生在西班牙语、意大利语和俄语中。令人惊讶的是,日语和当然英语没有发生这种情况。 - krishna5688
@MikeM. 有没有其他方法来解析西班牙语的浮点数值。 - krishna5688
1个回答

8
这是因为浮点数/双精度数在本地化输出为字符串时,使用逗号而不是句点。在这种情况下(以及许多其他语言 - 您已经注意到了西班牙语、意大利语、俄语,还有法语等),输出如下所示:

3,5

而不是

3.5

由于 Float.parse() 需要一个 "en" 本地化格式的字符串,因此可以使用 NumberFormat 类来实现,具体方法请参考这个答案
NumberFormat nf = NumberFormat.getInstance(Locale.forLanguageTag("es"));
Number parsedNumber = nf.parse(parsedString);
float parsedValueFloat = parsedNumber.floatValue();

1
而日语使用句号。 - Phantômaxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接