2012-05-14 11 views
16

Estoy haciendo un programa Java de Android que está tomando valores dobles del usuario. Si ejecuto el programa en la computadora, funciona muy bien debido a la configuración regional de mi computadora, EN_UK. Pero cuando lo ejecuto en mi teléfono móvil con la configuración regional FI_FI, no funcionará. Sé el motivo: en el Reino Unido las personas usan el punto como separador decimal, pero aquí en Finlandia el separador decimal es una coma.Dobles, comas y puntos

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

Cuando estoy usando la coma, dice java.lang.NumberFormatException: Invalid double: "1234,5".

¿Cómo puedo hacer que funcione con ambos, coma y punto?

+0

¿Por qué no acaba de analizar la cadena y vuelva a colocar la coma con puntos si es necesario? – guitarflow

+0

Una solución no tan inteligente es reemplazar primero todas las comas por puntos y luego tratar el número como si estuviera formateado con puntos. –

Respuesta

28

Utilice uno de los otros constructores de DecimalFormat:

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

Y luego tratar de analizarlo con las dos separadores.

+1

Con mucho, la mejor respuesta: si necesita DOT en lugar de COMMA, no busque más. –

4

utilizando DecimalFormatSymbols.getInstance() producirá los símbolos correctos de la configuración regional predeterminada, por lo que lo hará bien para cualquier plataforma en la que se ejecute.

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

Eso es equivalente a lo que él ya está haciendo. – Jerome

+0

getInstance (Locale.US) – Mikey

+0

Solo para el registro, necesita esta importación en su archivo 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
No

una mejor manera, pero trabajó para mí;

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

Esto debería funcionar tanto para Java (Probado), así como androide :)

  • Nombre de clase: 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(); 
        } 
    
    } 
    
  • Nombre de clase: Aplicación .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; 
         } 
        } 
    } 
    

Salida:

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

Esperamos que esto ayude a alguien para hacer uso de.

-1

me error:

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

... y este trabajo para mí

replace(",", "") 
Cuestiones relacionadas