用逗号作为小数分隔符的parseDouble的最佳方法是什么?

Koe*_*err 137 java

以下是导致Exception:

String p="1,234";
Double d=Double.valueOf(p); 
System.out.println(d);
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来解析"1,234"得到1.234:p = p.replaceAll(",",".");

dog*_*ane 195

使用java.text.NumberFormat:

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

  • NumberFormat的问题在于它会默默地忽略无效字符.因此,如果您尝试解析"1,23abc",它将很高兴地返回1.23而不向您指示传入的String包含不可解析的字符.在某些情况下可能实际上是可取的,但我认为这通常不是理想的行为. (16认同)
  • 这仅在当前默认语言环境恰好使用逗号作为小数分隔符时才有效. (10认同)
  • 对于TURKEY,您应该使用NumberFormat.getInstance(新的Locale(tr_TR)) (7认同)
  • 为了进一步搞砸,一些语言环境使用逗号作为*千位分隔符*,在这种情况下,"1,234"将解析为1234.0而不是抛出错误. (6认同)
  • 有关谁使用什么分隔符的信息,请参见http://en.wikipedia.org/w/index.php?title=Decimal_mark&uselang=de#mediaviewer/File:DecimalSeparator.svg (2认同)

Boz*_*zho 61

您可以使用此(法语区域设置具有,小数分隔符)

NumberFormat nf = NumberFormat.getInstance(Locale.FRANCE);
nf.parse(p);
Run Code Online (Sandbox Code Playgroud)

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

DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(symbols);
df.parse(p);
Run Code Online (Sandbox Code Playgroud)


dgo*_*ive 17

正如E-Riz指出的那样,NumberFormat.parse(String)将"1,23abc"解析为1.23.要获取整个输入,我们可以使用:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 此策略在此处详细说明:http://www.ibm.com/developerworks/library/j-numberformat/ (2认同)

小智 6

Double.parseDouble(p.replace(',','.'))
Run Code Online (Sandbox Code Playgroud)

...在以char-by-char为基础搜索基础字符数组时非常快.字符串替换版本编译RegEx以进行评估.

基本上替换(char,char)大约快10倍,因为你将在低级代码中做这些事情,所以考虑这个是有意义的.热点优化器无法弄明白......当然不在我的系统上.


小智 5

如果您不知道正确的语言环境并且字符串可以有千位分隔符,这可能是最后的手段:

    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(",", "."));
Run Code Online (Sandbox Code Playgroud)

请注意:这会很高兴地将诸如“R 1 52.43,2”之类的字符串解析为“15243.2”。