2012-05-14 15 views
16

私は、ユーザーから二重の値をとっているAndroid Javaプログラムを作っています。コンピュータでプログラムを実行すると、コンピュータのロケールEN_UKのためにうまくいきます。しかし、私がFI_FIロケールで自分の携帯電話でそれを実行すると、動作しません。私はその理由を知っています:英国の人々は10進数のセパレータとしてドットを使用しますが、ここでは10進数のセパレータはカンマです。ダブルス、コンマ、ドット

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

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

どうすればカンマとドットの両方で動作させることができますか?

+0

のためにこの仕事はなぜあなただ​​けの文字列を解析し、必要に応じてドットでコンマを置き換えるものではありませんか? – guitarflow

+0

あまり賢くない解決策は、すべてのカンマをドットで置き換えてから、ドットで書式設定されているかのように番号を扱うことです。 –

答えて

28

利用のDecimalFormatの他のコンストラクタの1:

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

そして、試してみて、両方のセパレータを使用してそれを解析。

+1

これまでのところ最良の答え - あなたがCOMMAの代わりにDOTが必要な場合は、それ以上見ないでください。 –

4

を使用すると、デフォルトのロケールの正しいシンボルが生成されるので、実行するプラットフォームに応じて適切に表示されます。

DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance()); 
+0

これは彼がすでにやっていることと同じです。 – Jerome

+0

getInstance(Locale.US) – Mikey

+0

レコードの場合は、Javaファイルに次のインポートが必要です。 import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; –

-2
DecimanFormat df = new DecimalFormat("#.#"); 
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; 
} 
0

ない最良の方法が、私のために働きました。

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; 
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(); 
        } 
    
    } 
    
  • クラス名:アプリケーション.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

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

-1

Meのエラー:

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

...と私

replace(",", "") 
関連する問題