Java 将字符串转换为BigDecimal而不丢失格式

Java 将字符串转换为BigDecimal而不丢失格式,java,string,bigdecimal,typeconverter,Java,String,Bigdecimal,Typeconverter,我正在尝试将字符串转换为BigDecimal,但无法保存格式。字符串是一个价格/数字,其格式可以是#、#、.00或#、.00 这是我尝试过的,但它不能保持格式不变。 37717840.33==>37717840.33 public static BigDecimal convertStringtoDecimal(String patternDecimalFormat, String pattern, String price) { DecimalFormatSymbols symb

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

这是我尝试过的,但它不能保持格式不变。 37717840.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 ;

}

从字符串中删除逗号

String price = "1,000,000,000.999999999999999";
BigDecimal result = new BigDecimal(value.replaceAll(",", ""));
System.out.println(result);
A是一个“[i]m可交换的任意精度有符号十进制数[]”

什么是“任意精度”?在导言中有这样一句话:

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

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

我为什么要提起这些?因为我想指出,
BigDecimal
只不过是一个奇特的数字。数字,至少在Java中,没有格式化的概念。考虑到这一点,您意识到期望一个
BigDecimal
来维护用于创建它的
字符串的格式是没有意义的。在您自己的代码中有提示;您必须使用中介
DecimalFormat
对象将
字符串
解析为
BigDecimal
。当
BigDecimal
有一个接受
字符串的构造函数时,为什么要这样做?这是因为
BigDecimal
构造函数非常有限。如果您试图使用构造函数转换
字符串
,您将得到一个
numberformatescepton
,并显示以下消息:“Character,既不是十进制数字、小数点,也不是“e”符号指数标记。”

如您所见,正是
十进制格式
理解代码中的
字符串
。这样做的原因是因为这正是
DecimalFormat
的设计目的。该类存在,因此您可以使用指定的模式(通常基于用户的
区域设置
)将
字符串
解析为
数字
并将
数字
解析为
字符串
)。如果要显示
数字
,如
大十进制
,但要以格式化方式显示,则必须使用类,如
十进制
。将数字转换为
字符串的一些选项包括:

  • 或者更一般地说,它的超类
  • 它使用自己的模式规则,如
  • 这使用了与
    String#格式(String,Object…)
    相同的规则
  • System.out
    是一个
    PrintStream
正如我在问题注释中指出的,在您的情况下,您应该能够通过调用

String formattedString = decimalFormat.format(bigDecimal);

在相同的
十进制格式上,或者至少在一个配置相同的格式上。

从字符串中删除逗号

String price = "1,000,000,000.999999999999999";
BigDecimal result = new BigDecimal(value.replaceAll(",", ""));
System.out.println(result);
导入java.math.BigDecimal



//结果:1000000000。999999999999999

BigDecimal
本身不格式化。它表示一个数字,而不是
字符串
。除非我误解了你想做什么?我看到您正在使用
DecimalFormat
String
转换为
BigDecimal
。要反转此操作,请执行
decimalFormat.format(bigDecimal)
。这将返回
BigDecimal
的格式化
字符串
。我有37717840.33格式的字符串或37717840.33格式的字符串,33我希望将它们转换为BigDecimal,同时保留格式/模式(保留、和.在字符串中的位置)