web-dev-qa-db-fra.com

Doubles, virgules et points

Je crée un programme Android Java qui prend deux valeurs de la part de l'utilisateur. Si j'exécute le programme sur l'ordinateur, cela fonctionne très bien en raison des paramètres régionaux de mon ordinateur, EN_UK. Mais lorsque je l'exécute sur mon téléphone portable avec les paramètres régionaux FI_FI, cela ne fonctionne pas. Je connais la raison: au Royaume-Uni, les gens utilisent le point comme séparateur décimal, mais ici en Finlande, le séparateur décimal est une virgule. 

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

Lorsque j'utilise une virgule, il est écrit Java.lang.NumberFormatException: Invalid double: "1234,5".

Comment puis-je le faire fonctionner avec eux deux, virgule et point?

18
MikkoP

Utilisez l'un des autres constructeurs de DecimalFormat:

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

Et ensuite, essayez de l'analyser en utilisant les deux séparateurs.

31
Jerome

l'utilisation de DecimalFormatSymbols.getInstance() produira les symboles corrects de l'environnement local par défaut, vous l'aurez donc parfaitement, quelle que soit la plate-forme sur laquelle vous vous exécutez.

DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance());
4
danf

Cela devrait fonctionner à la fois pour Java (testé) et pour Android :)

  • Nom de la classe: 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();
        }
    
    }
    
  • Nom de la classe: 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;
            }
        }
    }
    

Sortie: 

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

J'espère que cela aidera quelqu'un à s'en servir.

2
Ajay Kumar Meher
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;
}
1

Pas un meilleur moyen mais a travaillé pour moi;

    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;
0
NBurakBasaran