web-dev-qa-db-fra.com

Convertir une chaîne en double - Java

Quelle est la manière la plus simple et correcte de convertir un nombre String avec des virgules (par exemple: 835,111.2) en une instance Double.

Merci.

25
Rod

Jetez un œil à Java.text.NumberFormat . Par exemple:

import Java.text.*;
import Java.util.*;

public class Test
{
    // Just for the sake of a simple test program!
    public static void main(String[] args) throws Exception
    {
        NumberFormat format = NumberFormat.getInstance(Locale.US);

        Number number = format.parse("835,111.2");
        System.out.println(number); // or use number.doubleValue()
    }
}

Cependant, en fonction du type de quantité que vous utilisez, vous souhaiterez peut-être analyser un BigDecimal. La façon la plus simple de procéder est probablement:

BigDecimal value = new BigDecimal(str.replace(",", ""));

ou utilisez un DecimalFormat avec setParseBigDecimal(true):

DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US);
format.setParseBigDecimal(true);
BigDecimal number = (BigDecimal) format.parse("835,111.2");
47
Jon Skeet

Le plus simple n'est pas toujours le plus correct. Voici le plus simple:

String s = "835,111.2";
// NumberFormatException possible.
Double d = Double.parseDouble(s.replaceAll(",",""));

Je n'ai pas pris la peine des locales puisque vous avez spécifiquement déclaré que vous vouliez remplacer les virgules, donc je suppose que vous vous êtes déjà établi comme une locale avec une virgule est le séparateur des milliers et la période est le séparateur décimal. Il y a de meilleures réponses ici si vous voulez un comportement correct (en termes d'internationalisation).

10
paxdiablo

Utilisez Java.text.DecimalFormat:

DecimalFormat est une sous-classe concrète de NumberFormat qui formate les nombres décimaux. Il a une variété de fonctionnalités conçues pour permettre d'analyser et de formater des nombres dans n'importe quel lieu, y compris la prise en charge des chiffres occidentaux, arabes et indiens. Il prend également en charge différents types de nombres, y compris les entiers (123), les nombres à virgule fixe (123,4), la notation scientifique (1,23E4), les pourcentages (12%) et les montants en devises (123 $). Tous ces éléments peuvent être localisés.

5
skaffman

n lien peut dire plus de mille mots

// Format for CANADA locale
Locale locale = Locale.CANADA;
String string = NumberFormat.getNumberInstance(locale).format(-1234.56);  // -1,234.56

// Format for GERMAN locale
locale = Locale.GERMAN;
string = NumberFormat.getNumberInstance(locale).format(-1234.56);   // -1.234,56

// Format for the default locale
string = NumberFormat.getNumberInstance().format(-1234.56);


// Parse a GERMAN number
try {
    Number number = NumberFormat.getNumberInstance(locale.GERMAN).parse("-1.234,56");
    if (number instanceof Long) {
        // Long value
    } else {
        // Double value
    }
} catch (ParseException e) {
}
2
Tim Büthe
    There is small method to convert german price format
    public static BigDecimal getBigDecimalDe(String preis) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
        Number number = nf.parse(preis);
        return new BigDecimal(number.doubleValue());
    }
  ----------------------------------------------------------------------------  
    German format BigDecimal Preis into decimal format
  ----------------------------------------------------------------------------  
    public static String decimalFormat(BigDecimal Preis){       
        String res = "0.00";
                    if (Preis != null){                 
                        NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
                        if (nf instanceof DecimalFormat) {                      
                             ((DecimalFormat) nf).applyPattern("###0.00");

                             }
                            res =    nf.format(Preis);                                  
                    }
            return res;

        }
---------------------------------------------------------------------------------------
/**
 * This method converts Deutsche number format into Decimal format.
 * @param Preis-String parameter.
 * @return
 */
public static BigDecimal bigDecimalFormat(String Preis){        
    //MathContext   mi = new MathContext(2);
    BigDecimal bd = new BigDecimal(0.00);
                if (!Util.isEmpty(Preis)){  
                    try {
//                      getInstance() obtains local language format
                    NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);  
                     nf.setMinimumFractionDigits(2);
                     nf.setMinimumIntegerDigits(1);
                     nf.setGroupingUsed(true);


                    Java.lang.Number    num = nf.parse(Preis);
                    double d = num.doubleValue();
                         bd = new BigDecimal(d);
                    } catch (ParseException e) {                        
                        e.printStackTrace();
                    }                       
                }else{
                     bd = new BigDecimal(0.00);
                }

                //Rounding digits 
        return bd.setScale(2, RoundingMode.HALF_UP);

    }
1