176 votes

meilleure façon de parseDouble avec une virgule comme séparateur décimal?

String p="1,234";
Double d=Double.valueOf(p); 
System.out.println(d);

retourner une erreur.

ce que le besy façon d'obtenir de l' 1.234 ?

mieux que: p=p.replaceAll(",",".");

merci beaucoup :)

238voto

dogbane Points 85749

L'utilisation de java.texte.NumberFormat:

    NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
    Number number = format.parse("1,234");
    double d = number.doubleValue();

74voto

Bozho Points 273663

Vous pouvez l'utiliser (les paramètres régionaux français a , pour le séparateur décimal)

NumberFormat nf = NumberFormat.getInstance(Locale.FRANCE);
nf.parse(p);

Ou vous pouvez utiliser java.text.DecimalFormat et définir les symboles:

DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(symbols);
df.parse(p);

22voto

En tant que E-Riz points, NumberFormat.parse(String) analyser "1,23 abc" comme 1.23. Pour prendre l'ensemble de l'entrée on peut utiliser:

public double parseDecimal(String input) throws NullPointerException, ParseException{
  if(input == null){
    throw new NullPointerException();
  }

  input = input.trim();

  NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.FRANCE);
  ParsePosition parsePosition = new ParsePosition(0);
  Number number = numberFormat.parse(input, parsePosition);

  if(parsePosition.getIndex() != input.length()){
    throw new ParseException("Invalid input", parsePosition.getIndex());
  }

  return number.doubleValue();
}

5voto

user3506443 Points 11

Si vous ne connaissez pas la bonne localisation et la chaîne peut avoir un séparateur de milliers, cela pourrait être une solution de dernier recours:

    doubleStrIn = doubleStrIn.replaceAll("[^\\d,\\.]++", "");
    if (doubleStrIn.matches(".+\\.\\d+,\\d+$"))
        return Double.parseDouble(doubleStrIn.replaceAll("\\.", "").replaceAll(",", "."));
    if (doubleStrIn.matches(".+,\\d+\\.\\d+$"))
        return Double.parseDouble(doubleStrIn.replaceAll(",", ""));
    return Double.parseDouble(doubleStrIn.replaceAll(",", "."));

Attention: ce seront heureux de vous analyser des chaînes comme "R 1 52.43,2" à "15243.2".

4voto

Pete Points 201

C'est la méthode statique-je utiliser dans mon code:

public static double sGetDecimalStringAnyLocaleAsDouble (String value) {

    Locale theLocale = Locale.getDefault();
    NumberFormat numberFormat = DecimalFormat.getInstance(theLocale);
    Number theNumber;
    try {
        theNumber = numberFormat.parse(value);
        return theNumber.doubleValue();
    } catch (ParseException e) {
        SKLogger.sAssert(SKCommon.class,  false);

        String valueWithDot = value.replaceAll(",",".");
        return Double.valueOf(valueWithDot);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X