2012-05-14 20 views
16

Tworzę program Java dla systemu Android, który odbiera podwójne wartości od użytkownika. Jeśli uruchomię program na komputerze, działa świetnie, ponieważ jest to język mojego komputera, EN_UK. Ale kiedy uruchomię go na moim telefonie komórkowym z locale FI_FI, to nie zadziała. Znam powód: w Wielkiej Brytanii ludzie używają kropki jako separatora dziesiętnego, ale tutaj w Finlandii separatorem dziesiętnym jest przecinek.Podwaja, przecinki i kropki

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

Kiedy używam przecinka, jest to java.lang.NumberFormatException: Invalid double: "1234,5".

Jak mogę sprawić, aby działało z nimi zarówno przecinkiem, jak i kropką?

+0

Dlaczego nie można po prostu analizować ciąg i zastąpić przecinek z kropkami w razie potrzeby? – guitarflow

+0

Niezbyt inteligentnym rozwiązaniem jest najpierw zastąpić przecinki kropkami, a następnie traktować liczbę tak, jakby była sformatowana kropką. –

Odpowiedz

28

Użyj jednej z innych konstruktorów DecimalFormat:

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

a następnie spróbuj i analizować je za pomocą obu separatorów.

+1

Zdecydowanie najlepszą odpowiedzią - jeśli potrzebujesz DOT zamiast COMMA, nie patrz dalej. –

4

użyciu DecimalFormatSymbols.getInstance() będzie produkować domyślne ustawienia regionalne w poprawnych symboli, więc będzie uzyskać prawo do dowolnej platformie można uruchomić na.

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

To odpowiednik tego, co już robi. – Jerome

+0

getInstance (Locale.US) – Mikey

+0

Tylko dla rekordu, potrzebujesz tego importu w twoim pliku Java: import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; –

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

Nie najlepszy sposób, ale pracował dla mnie;

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

To powinno działać zarówno Java (testowane) oraz android :)

  • Class Nazwa: 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(); 
        } 
    
    } 
    
  • Class Nazwa: 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; 
         } 
        } 
    } 
    

wyjściowa:

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

nadzieję, że pomoże ktoś wykorzystać.

-1

mi błąd:

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

... i to praca dla mnie

replace(",", "") 
Powiązane problemy