18

ユーザーから double 値を取得する Android Java プログラムを作成しています。このプログラムをコンピューターで実行すると、コンピューターのロケールが EN_UK であるため、問題なく動作します。しかし、FI_FI ロケールを使用して携帯電話で実行すると、機能しません。理由はわかっています。イギリスではドットを小数点記号として使用しますが、ここフィンランドでは小数点記号はコンマです。

DecimalFormat df = new DecimalFormat("#.#");
Double returnValue = Double.valueOf(df.format(doubleNumber));

コンマを使用しているときは、 と表示されますjava.lang.NumberFormatException: Invalid double: "1234,5"

コンマとドットの両方で機能させるにはどうすればよいですか?

4

7 に答える 7

33

DecimalFormat の他のコンストラクタのいずれかを使用します。

new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US))

そして、両方のセパレータを使用して解析してみてください。

于 2012-05-14T14:12:32.383 に答える
4

を使用DecimalFormatSymbols.getInstance() すると、デフォルトのロケールの正しいシンボルが生成されるため、実行しているどのプラットフォームでも正しく取得できます。

DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance());
于 2012-05-14T14:15:29.430 に答える
2

これは、Java(テスト済み)と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

これが誰かが利用するのに役立つことを願っています。

于 2015-04-10T08:01:07.977 に答える
1
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;
}
于 2014-05-07T19:39:04.073 に答える
-1

私のエラー:

java.lang.NumberFormatException: Invalid float: "1,683.88"

...そしてこれは私にとってはうまくいきます

replace(",", "")
于 2016-12-14T14:56:41.897 に答える
-2
DecimanFormat df = new DecimalFormat("#.#");
于 2013-02-12T01:55:52.957 に答える