我正在尝试将字符串转换为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 ;
}
答案 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
的一些选项是:
DecimalFormat
NumberFormat
String#format(String, Object...)
Formatter
PrintStream#(String, Object...)
String
相同的规则。String#format(String, Object...)
是System.out
正如我在问题评论中指出的那样,在您的情况下,您应该可以通过调用
来取回格式化的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