Android: Spanish: Problem parsing float value: Crashing apps
Android: Spanish: Problem parsing float value: crashing apps steps:
1.set language as Spanish in app
2. Convert some floating point value to one-bit
3.View formatted value to swim again
Application crash.
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
+3
source to share
1 answer
This is because the localized float / double output for strings, in this case (and many other languages ββ- you noted Spanish, Italian, Russian, there is also French and others), uses a comma, not a period:
3.5
instead
3.5
Since it Float.parse()
expects a string with the formatting "en", the way to do it is to use a class NumberFormat
, as per this answer :
NumberFormat nf = NumberFormat.getInstance(Locale.forLanguageTag("es"));
Number parsedNumber = nf.parse(parsedString);
float parsedValueFloat = parsedNumber.floatValue();
+6
source to share