Search code examples
javabigdecimaldecimalformat

Replace grouping separator of DecimalFormat in formatted value


I've used DecimalFormat df = new DecimalFormat("#,###.00"); to format a BigDecimal.

Now, I want to use that formatted value (say it is '1 250,00') to create new BigDecimal. I've tried this:

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

But that space between 1 and 2 in 1 250.00 is not replaced. How can I fix it?

Example:

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

Solution

  • DecimalFormat Javadoc specifies that the symbol , is the grouping separator. By default, for your locale, this separator is not a space but a non-breaking space. This can be shown by the following code:

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

    You will see that the int printed is 160, which corresponds to "Non-breaking space" in ISO-8859-1.

    To remove that character, we can use its Unicode representation and replace that:

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

    For a more general solution, not depending on the current locale, we could retrieve the grouping separator and use that directly:

    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, ""));