将String转换为BigDecimal而不会丢失格式

时间:2018-06-12 11:41:35

标签: java string bigdecimal typeconverter

我正在尝试将字符串转换为BigDecimal,但我无法保留格式。字符串是一个价格/数字,格式可以是#,###。00或####,00

这是我尝试过的,但它不保持格式完整。 37,717,840.33 ==> 37717840.33

public static BigDecimal convertStringtoDecimal(String patternDecimalFormat, 
String pattern, String price) { 

    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator(pattern.charAt(0));
    symbols.setGroupingSeparator(pattern.charAt(1));
    DecimalFormat decimalFormat = new DecimalFormat(patternDecimalFormat, symbols);
    decimalFormat.setParseBigDecimal(true);

    BigDecimal bigDecimal = null;
    try {
        bigDecimal = (BigDecimal) decimalFormat.parse(price);
    } catch (ParseException e) { 

        LOGGER.warn("Exception convertion string to dec", e);
    }
    return bigDecimal ;

}

3 个答案:

答案 0 :(得分:1)

BigDecimal是“[i] mmutable,任意精度的有符号十进制数[]”。

什么是“任意精度”?这个Wikipedia article在其介绍中有这个说法:

  

在计算机科学中,任意精度算术,也称为bignum算术,多精度算术或有时是无限精度算术,表示对精度数字仅受主机可用内存限制的数字执行计算系统。这与大多数算术逻辑单元(ALU)硬件中的更快的固定精度算法形成对比,后者通常提供8到64位的精度。

换句话说,BigDecimal是一种特殊类型的Number,它允许“完美”(它无法处理无理数)精度。这与具有“固定精度”的Double(或原始类型double)形成对比,因此不能代表BigDecimal可以的所有数字。这种精度的提高是以增加内存使用和更慢的数学运算为代价的(计算机可以在硬件级别处理double等。)

为什么我把这一切都搞定了?因为我想指出BigDecimal只不过是一个花哨的数字。至少在Java中,数字没有格式化的概念。考虑到这一点,您意识到期望BigDecimal维护用于创建它的String的格式是没有意义的。你自己的代码中有这方面的提示;您必须使用中间DecimalFormat对象将String解析为BigDecimal。当BigDecimal有一个带String的构造函数时,为什么还要这样做呢?这是因为BigDecimal构造函数非常有限。如果您尝试使用构造函数转换String,则会收到NumberFormatExcepton,并显示以下消息:“字符,既不是十进制数字,小数点,也不是”e “符号指数标记。

如您所见,DecimalFormat了解代码中的String。这是因为DecimalFormat设计的。该类存在,因此您可以使用指定的模式(通常基于用户的{{1})将String解析为Number s和Number s String s })。如果要以Locale显示Number但需要格式化,则必须使用BigDecimal等类。将数字转换为DecimalFormat的一些选项是:

正如我在问题评论中指出的那样,在您的情况下,您应该可以通过调用

来取回格式化的PrintStream
String

在同一个String formattedString = decimalFormat.format(bigDecimal); 或至少一个配置相同的地方。

答案 1 :(得分:0)

从字符串中删除逗号。

spec

答案 2 :(得分:0)

从字符串中删除逗号。

导入 java.math.BigDecimal;


    String price = "1,000,000,000.999999999999999";
    BigDecimal result = new BigDecimal(price.replaceAll(",", ""));
    System.out.println("Prueba: " + result.toString());

//结果:1000000000.999999999999999