parseDouble用逗号作为十进制分隔符的最佳方法?

以下是导致一个Exception

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

有没有更好的方法来parsing"1,234"得到1.234比: p = p.replaceAll(",",".");

使用java.text.NumberFormat :

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

你可以使用这个(法语区域设置为小数点分隔符)

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

或者你可以使用java.text.DecimalFormat并设置适当的符号:

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

正如E-Riz指出的那样,NumberFormat.parse(String)将“1,23abc”parsing为1.23。 要采取整个input,我们可以使用:

 public double parseDecimal(String 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(); } 

如果您不知道正确的语言环境,并且string可能有千位分隔符,则可能是最后一招:

  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(",", ".")); 

注意:这会很乐意将string“R 1 52.43,2”parsing为“15243.2”。

这是我在我自己的代码中使用的静态方法:

 public static double sGetDecimalStringAnyLocaleAsDouble (String 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 string 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 String valueWithDot = value.replaceAll(",","."); try { return Double.valueOf(valueWithDot); } catch (NumberFormatException e2) { // This happens if we're trying (say) to parse a string 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(',','.')) 

…非常快,因为它逐字符地search底层字符数组。 stringreplace版本编译RegEx来评估。

基本上replace(char,char)大约快了10倍,因为你将在低级代码中做这些事情,所以考虑这个是有意义的。 热点优化器不会弄清楚…当然不在我的系统上。

这将做到这一点:

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