2016-10-04 82 views
1

在我的Java代码中,我有四个文本格式的数字(String): Es。将String转换为大十进制的一般方法

String s1 = "1234.56"; 
String s2 = "1235,56"; 
String s3 = "1,234.56"; 
String s4 = "1.234,56"; 

我想将这些字符串转换为BigDecimal的:

BigDecimal b1 = new BigDecimal(s1); 
... 
... 

显然,这是行不通的,因为BigDecimal的不接受所有格式(用逗号字符串)。 有一种通用的方法可以让我转换BigDecimal中的所有字符串?

回答

0

DecimalFormat怎么办? Doc here

你只需要解析字符串之前定义的小数点分隔符的图案......

DecimalFormat decimalFormat = new DecimalFormat("#,###.##"); 
decimalFormat.setParseBigDecimal(true); 
BigDecimal bigDecimal = (BigDecimal) decimalFormat.parse("1,234.56"); 
System.out.println(bigDecimal); 

应该做的伎俩

+0

好的,但我真的不知道“n”字符串的格式。 用例是:我有一个字符串数组,我必须转换。 – fuerteVentura22

+0

如果你没有模式,你不能解析任何东西。如何在没有图案的情况下区分“1,234.56”和“1.234,56”? – BenB

+0

如果您知道总是有2位小数,您可以选择小数点分隔符来构建我认为的模式.... – BenB

1

小数部分是现场八方依赖,所以你可以使用NumberFormat类并使用解析结果作为字符串从中获取BigDecimal

示例:

final NumberFormat format = NumberFormat.getInstance(Locale.FRANCE); 
final Number number = format.parse("3,1415"); 
final BigDecimal bd = new BigDecimal(number.toString()); 
System.out.println(bd); 
+0

由于'format.parse' [将返回Double](http:// docs .oracle.com/javase/8/docs/api/java/text/NumberFormat.html#parse-java.lang.String-java.text.ParsePosition-),这会遭遇与[BigDecimal(double )构造函数](http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-):与输入字符串不匹配的不精确的值。 – VGR

+0

为字符串“s3”打印1.234 – fuerteVentura22

+0

是的,并且1.234是Bigdecimal的有效输入 –

0

要覆盖所有的情况下,我建议以下IMPL:

private static BigDecimal convertToBigDecimal(String s) { 
    StringBuilder sb = new StringBuilder(); 

    if (s.indexOf('.') != -1 && s.indexOf(',') != -1) { 
     s = s.replace(',', '.'); 
     String[] ss = s.split("\\."); 
     for (int i = 0; i < ss.length; i++) { 
      if (i > 0 && i == ss.length - 1) { 
       sb.append('.'); 
      } 
      sb.append(ss[i]); 
     } 
    } else if (s.indexOf('.') != -1) { 
     String[] ss = s.split("\\."); 
     if (ss.length > 2) { 
      sb.append(s.replace(".", "")); 
     } else { 
      // assume it is decimal delimiter 
      sb.append(ss[0]).append('.').append(ss[1]); 
     } 
    } else if (s.indexOf(',') != -1) { 
     String[] ss = s.split(","); 
     if (ss.length > 2) { 
      sb.append(s.replace(",", "")); 
     } else { 
      // assume it is decimal delimiter 
      sb.append(ss[0]).append('.').append(ss[1]); 
     } 
    } 

    BigDecimal bd = new BigDecimal(sb.toString()); 
    return bd; 
} 

的想法是第一次检查,如果我们有两个比我们绝对有小数部分,我们全部更换,.,然后跳过所有.除最后一个。否则,如果我们有几个相同的分隔符,它是没有小数部分的数字。在其他情况下,我们需要知道模式以区分是否有小数。对于样本编号,我们假定它是用十进制。

+0

对于“1,234,567”(无小数部分),结果将是错误的...(1234.567)但这是迄今为止最好的拍摄... – BenB

+0

你是对的@BenB。区分不知道案例111,222的模式是1112222还是111.222是不真实的。 –

相关问题