gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:05:50 25 4
gpt4 key购买 nike

我正在尝试将字符串转换为 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 ;

}

最佳答案

一个BigDecimal是一个“[i]不可变的、任意精度的有符号十进制数[]”。

什么是“任意精度”?这个Wikipedia article简介中有这样一句话:

In computer science, arbitrary-precision arithmetic, also called bignum arithmetic, multiple-precision arithmetic, or sometimes infinite-precision arithmetic, indicates that calculations are performed on numbers whose digits of precision are limited only by the available memory of the host system. This contrasts with the faster fixed-precision arithmetic found in most arithmetic logic unit (ALU) hardware, which typically offers between 8 and 64 bits of precision.

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

我为什么要提出这一切?因为我想指出,BigDecimal只不过是一个花哨的数字。而数字,至少在 Java 中,没有格式的概念。考虑到这一点,您就会意识到期望 BigDecimal 维护用于创建它的 String 的格式是没有意义的。您自己的代码中有对此的提示;您必须使用中间 DecimalFormat 对象将 String 解析为 BigDecimal。当 BigDecimal 有一个采用 String 的构造函数时,为什么必须执行此操作?这是因为 BigDecimal 构造函数非常有限。如果您尝试使用构造函数转换 String,您将收到 NumberFormatExcepton 并显示以下消息:“Character , 不是十进制数字,小数点,也不是“e”表示法指数标记。

如您所见,DecimalFormat 可以理解代码中的String。这样做的原因是因为这就是DecimalFormat 的设计目的。该类存在,因此您可以使用指定模式将 String 解析为 Number,并将 Number 解析为 String (通常基于用户的区域设置)。当您想要显示Number(例如BigDecimal)但以格式化方式显示时,您必须使用诸如DecimalFormat之类的类。将数字转换为字符串的一些选项是:

正如我在问题评论中指出的那样,在您的情况下,您应该能够通过调用取回格式化的String

String formattedString = decimalFormat.format(bigDecimal);

使用相同的DecimalFormat或至少一个配置相同的DecimalFormat

关于java - 将 String 转换为 BigDecimal 而不丢失格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50816293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com