Ответ 1
Используйте один из других конструкторов DecimalFormat:
new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US))
И затем попробуйте и проанализируйте его, используя оба разделителя.
Я делаю Java-программу для Android, которая принимает двойные значения от пользователя. Если я запускаю программу на компьютере, она прекрасно работает из-за локали моего компьютера, EN_UK. Но когда я запускаю его на своем мобильном телефоне с локалью FI_FI, это не сработает. Я знаю причину: в Великобритании люди используют точку в качестве десятичного разделителя, но здесь, в Финляндии, десятичный разделитель - запятая.
DecimalFormat df = new DecimalFormat("#.#");
Double returnValue = Double.valueOf(df.format(doubleNumber));
Когда я использую запятую, он говорит java.lang.NumberFormatException: Invalid double: "1234,5"
.
Как я могу заставить это работать с ними обоими, запятой и точкой?
Используйте один из других конструкторов DecimalFormat:
new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US))
И затем попробуйте и проанализируйте его, используя оба разделителя.
с помощью DecimalFormatSymbols.getInstance()
создаст правильные символы языка по умолчанию, поэтому вы получите это право для любой платформы, на которой вы запускаете.
DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance());
Это должно работать как для Java (Tested), так и для android:)
Имя класса: In18Helper.java
package com.akmeher.app.utils;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class In18Helper {
private final static In18Helper mHelper = new In18Helper();
public static final In18Helper getInstance() {
return mHelper;
}
public double getDouble(String sValue, Locale locale) {
NumberFormat numberFormat = NumberFormat.getInstance(locale);
Number parse = null;
try {
parse = numberFormat.parse(sValue);
} catch (ParseException e) {
e.printStackTrace();
}
return parse == null ? 0 : parse.doubleValue();
}
}
Имя класса: Application.java
package com.akmeher.app;
import java.util.Locale;
import com.akmeher.app.utils.In18Helper;
public class Application {
static DataModel[] testData = new DataModel[] {
new DataModel("1.034567", Locale.ENGLISH),
new DataModel("1,0345.67", Locale.ENGLISH),
new DataModel("1.0345,67", Locale.GERMANY),
new DataModel("1,034,567", Locale.CANADA),
new DataModel("1.034567", Locale.KOREA),
new DataModel("1,03.4567", Locale.ITALY) };
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < testData.length; i++) {
double d = In18Helper.getInstance().getDouble(testData[i].mValue,
testData[i].mLocale);
System.out.println("Trial Value: "+testData[i].mValue+" for Locale: "+testData[i].mLocale+" converted to: "+d);
}
}
private static class DataModel {
String mValue;
Locale mLocale;
public DataModel(String value, Locale locale) {
this.mLocale = locale;
this.mValue = value;
}
}
}
Выход:
Trial Value: 1.034567 for Locale: en converted to: 1.034567
Trial Value: 1,0345.67 for Locale: en converted to: 10345.67
Trial Value: 1.0345,67 for Locale: de_DE converted to: 10345.67
Trial Value: 1,034,567 for Locale: en_CA converted to: 1034567.0
Trial Value: 1.034567 for Locale: ko_KR converted to: 1.034567
Trial Value: 1,03.4567 for Locale: it_IT converted to: 1.03
Надеюсь, это поможет кому-то воспользоваться.
public static Double parseDoubleTL(String value){
DecimalFormat df = new DecimalFormat("#.#", new DecimalFormatSymbols(new Locale("tr_TR")));
Double doublePrice = 0.0;
try {
doublePrice = df.parse(value).doubleValue();
} catch (ParseException e) {
Log.w(MainActivity.TAG,"Couldnt parse TL. Error is "+e.toString());
}
return doublePrice;
}
Не лучший способ, но работал у меня;
Double val=null;
try{
val=Double.valueOf(value);
}catch(Exception e){
val=Double.valueOf(value.replace(',','.'));
}
Double val=null;
try{
val=Double.valueOf(value);
}catch(Exception e){
val=Double.valueOf(value.replace(',','.'));
}
return val;
Me Ошибка:
java.lang.NumberFormatException: Invalid float: "1,683.88"
... и эта работа для меня
replace(",", "")
DecimanFormat df = new DecimalFormat("#.#");