Meilleur moyen d’parsingr Double avec une virgule comme séparateur décimal?

Suite à une Exception :

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

Existe-t-il un meilleur moyen d’parsingr "1,234" pour obtenir 1.234 que: p = p.replaceAll(",","."); ?

Utilisez java.text.NumberFormat :

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

Vous pouvez utiliser ceci (les parameters régionaux français ont pour 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 appropriés:

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

Comme E-Riz le fait remarquer, NumberFormat.parse (Ssortingng) parsing “1,23abc” en 1.23. Pour prendre toute la consortingbution que nous pouvons utiliser:

 public double parseDecimal(Ssortingng input) throws ParseException{ NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault()); 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(); } 

Si vous ne connaissez pas les parameters régionaux corrects et que la chaîne peut contenir un séparateur de milliers, cela pourrait être un 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(",", ".")); 

Soyez conscient: cela parsingra avec plaisir des chaînes comme “R 1 52.43,2” à “15243.2”.

C’est la méthode statique que j’utilise dans mon propre code:

 public static double sGetDecimalSsortingngAnyLocaleAsDouble (Ssortingng value) { if (value == null) { Log.e("CORE", "Null value!"); return 0.0; } Locale theLocale = Locale.getDefault(); NumberFormat numberFormat = DecimalFormat.getInstance(theLocale); Number theNumber; try { theNumber = numberFormat.parse(value); return theNumber.doubleValue(); } catch (ParseException e) { // The ssortingng value might be either 99.99 or 99,99, depending on Locale. // We can deal with this safely, by forcing to be a point for the decimal separator, and then using Double.valueOf ... //http://stackoverflow.com/questions/4323599/best-way-to-parsedouble-with-comma-as-decimal-separator Ssortingng valueWithDot = value.replaceAll(",","."); try { return Double.valueOf(valueWithDot); } catch (NumberFormatException e2) { // This happens if we're trying (say) to parse a ssortingng that isn't a number, as though it were a number! // If this happens, it should only be due to application logic problems. // In this case, the safest thing to do is return 0, having first fired-off a log warning. Log.w("CORE", "Warning: Value is not a number" + value); return 0.0; } } } 
 Double.parseDouble(p.replace(',','.')) 

… est très rapide, car il recherche le tableau de caractères sous-jacent par char. Les versions de remplacement de chaîne comstacknt un RegEx à évaluer.

Fondamentalement, remplacer (char, char) est environ 10 fois plus rapide et comme vous faites ce genre de choses dans le code de bas niveau, il est logique d’y penser. L’optimiseur de Hot Spot ne le comprendra pas … Certainement pas sur mon système.

Vous devez bien sûr utiliser les parameters régionaux corrects. Cette question aidera.

Cela ferait le travail:

 Double.parseDouble(p.replace(',','.'));