2016-08-23 75 views
0

我正在寻找一种有效的方法,让String的数字格式正确,因此可以将其解析为double值。如何正确格式化一个数字字符串

要求:

  • 忽略字符串不仅包括数字,逗号(,)或点(。)
  • 重新格式化数字字符串,以便它可以被解析以双重使用 Double.parseDouble(numberString);
  • 投掷NumberFormatException异常当输入字符串无效

实例:1.234.567,89 => 1234567.89; 5 => 5; 6.3 => 6.3; 5.23 => 5.23; ...

要检查String是否是一个数字,我想使用正则表达式或NumberUtils.isNumber(numberString)。只有后者的问题是它有像“123,45”这样的字符串问题。

我目前的尝试(那种感觉非常低效):

LOGGER.debug("Normalizing price string: " + price); 
    String str = price; 

    if (str.contains(",") || str.contains(".")) { 

     int pos = -1; 
     if (str.contains(",")) pos = str.lastIndexOf(','); 
     else if (str.contains(".")) pos = str.lastIndexOf("."); 

     //Remove all the dots and commas first 
     str = str.replaceAll("[,.]", ""); 

     if (!NumberUtils.isNumber(str) || !NumberUtils.isDigits(str)) { 
      LOGGER.debug("String does not match expected pattern"); 
      throw new NumberFormatException(); 
     } else { 
      //Add a dot back in 

      if (str.length() <= 2) { 
       StringBuilder first = new StringBuilder(str.substring(0, pos)); 
       first.append('.'); 
       String last = str.substring(pos); 
       str = first + last; 
      } else { 
       StringBuilder first = new StringBuilder(str.substring(0, str.length() - 2)); 
       first.append('.'); 
       String last = str.substring(str.length() - 2); 

       str = first + last; 
      } 
     } 
    } 

    LOGGER.debug("Normalised result: " + str); 
    return str;` 

怎么可以这样的格式被简化,更加高效,正确处理不正确的输入?

应用解决方案

String str = price; 
    DecimalFormatSymbols dfsDot = new DecimalFormatSymbols(); 
    dfsDot.setDecimalSeparator('.'); 
    DecimalFormatSymbols dfsComma = new DecimalFormatSymbols(); 
    dfsComma.setDecimalSeparator(','); 

    DecimalFormat dfDot = new DecimalFormat("#,##0.00", dfsDot); 
    DecimalFormat dfComma = new DecimalFormat("#,##0.00", dfsComma); 

    double d = 0; 
    try { 
     if (!str.contains(",") && !str.contains(".")) { 
      return str; 
     } else if (str.contains(",")) d = (Double) dfComma.parse(str); 
     else if (str.contains(".")) d = (Double) dfDot.parse(str); 
     str = "" + d; 
    } catch (ParseException e) { 
     LOGGER.debug(str + " couldn't be cast to Double"); 
     e.printStackTrace(); 
     return price; 
    } 
+0

的String.format(...)? – tbsalling

回答

3

你知道DecimalFormat

DecimalFormatSymbols dfs =new DecimalFormatSymbols(); 
dfs.setDecimalSeparator('.'); 
DecimalFormat df = new DecimalFormat("#,##0.00",dfs); 
double d = df.parse("123.45").doubleValue(); 
System.out.println(d); 

它打印:

123.45 
+0

使用“DecimalFormat”的+1。但是,这不会通过我的测试与某些值。它抛出一个'ClassCastException'值为:“123.45”,“5”,...(这实际上已经很好转换为双倍我会认为。 – Thibstars