替换格式化值中 DecimalFormat 的分组分隔符

Replace grouping separator of DecimalFormat in formatted value

我用 DecimalFormat df = new DecimalFormat("#,###.00"); 格式化了一个 BigDecimal

现在,我想使用该格式化值(比如“1 250,00”)来创建 new BigDecimal。我试过这个:

BigDecimal result = new BigDecimal(model.getValue().replace(",",".").replace(" ",""));

但是1250.00中1到2之间的那个space没有被替换。我该如何解决?

示例:

DecimalFormat df = new DecimalFormat("#,###.00");
BigDecimal example = new BigDecimal("1250");
String str = df.format(example);
System.out.println(str.replace(",",".").replace(" ",""));

您可以使用 DecimalFormat 对象中的 parse 方法。

df.setParseBigDecimal(true);    
BigDecimal bigDecimal = (BigDecimal) df.parse(model.getValue());

查看this SO question中选择的答案。

按照你的格式

new DecimalFormat("#,###.00"); 

符号,用于分组分隔符。从您的格式中删除符号 , 后,您将获得输出 1250.00(在您的情况下没有分组分隔符 space) .

DecimalFormat df = new DecimalFormat("####.00");
BigDecimal example = new BigDecimal("1250");
String str = df.format(example);
System.out.println(str.replace(",",".").replace(" ",""));

Output: 1250.00

有替代的 (2nd) 解决方案,它可以在不改变格式“#,###.00”的情况下工作。使用 DecimalFormat 中的 .setGroupingSize(0)

DecimalFormat df = new DecimalFormat("#,###.00");
df.setGroupingSize(0);
BigDecimal example = new BigDecimal("1250");
String str = df.format(example);
System.out.println(str);

Output: 1250.00

DecimalFormat Javadoc 指定符号 , 是分组分隔符。默认情况下,对于您的语言环境,此分隔符是 而不是 和 space,而是一个不间断的 space。这可以通过以下代码显示:

DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.forLanguageTag("ru-RU"));
System.out.println((int) symbols.getGroupingSeparator());

你会看到打印出来的int是160,对应ISO-8859-1中的"Non-breaking space"

要删除该字符,我们可以使用它的 Unicode representation 并替换它:

DecimalFormat df = new DecimalFormat("#,###.00");
String str = df.format(new BigDecimal("1250"));
System.out.println(str.replace(",", ".").replace("\u00A0", ""));

对于更通用的解决方案,不依赖于当前语言环境,我们可以检索分组分隔符并直接使用它:

DecimalFormat df = new DecimalFormat("#,###.00");
String groupingSeparator = String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator());
String str = df.format(new BigDecimal("1250"));
System.out.println(str.replace(",", ".").replace(groupingSeparator, ""));

您可以使用 DecimalFormatSymbols 在您的模式中设置 分组分隔符(例如千位分隔符) 字符。看起来在您的语言环境中它是不间断的 space 所以尝试将其设置为正常 space 就像

DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.getDefault());
symbols.setGroupingSeparator(' ');//simple space

DecimalFormat df = new DecimalFormat("#,###.00", symbols);

BigDecimal example = new BigDecimal("1250");
String str = df.format(example);

现在您的格式化程序将使用简单的 space,这样您就可以用您的代码替换它

System.out.println(str.replace(",", ".").replaceAll(" ", ""));

输出:1250.00.