将String转换为Big Decimal的一般方法

时间:2016-10-04 14:24:53

标签: java numbers decimal number-formatting bigdecimal

在我的Java代码中,我有四个文本格式的数字(String): ES。

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中的所有字符串吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

DecimalFormat怎么样? Doc here

在解析字符串之前,您只需要为小数点分隔符定义一个模式...

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

应该做的伎俩

答案 2 :(得分: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;
}

首先检查一下我们是否同时拥有小数部分,然后将所有,替换为.,然后跳过除最后一个之外的所有.。否则,如果我们有几个相同的分隔符,则它是没有小数部分的数字。在其他情况下,我们需要知道模式以区分小数与否。对于样本数,我们假设它是带小数的。