Java 将字符串转换为BigDecimal而不丢失格式
我正在尝试将字符串转换为BigDecimal,但无法保存格式。字符串是一个价格/数字,其格式可以是#、#、.00或#、.00 这是我尝试过的,但它不能保持格式不变。 37717840.33==>37717840.33Java 将字符串转换为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
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。999999999999999BigDecimal
本身不格式化。它表示一个数字,而不是字符串。除非我误解了你想做什么?我看到您正在使用DecimalFormat
从String
转换为BigDecimal
。要反转此操作,请执行decimalFormat.format(bigDecimal)
。这将返回BigDecimal
的格式化字符串
。我有37717840.33格式的字符串或37717840.33格式的字符串,33我希望将它们转换为BigDecimal,同时保留格式/模式(保留、和.在字符串中的位置)