Java中如何格式化Bigdecimal

3
我希望按照以下规则格式化BigDecimal值:
25 => 25
25,1 => 25,10
25,10 => 25,10
25,12 = > 25,12

我在论坛中搜索了一下,但没有找到匹配的问题(这里, 这里这里),并且查看了BigDecimalNumberFormat的javadoc,但不知道如何实现。
编辑: 今天我做了以下事情:
NumberFormat currencyFormat02 = NumberFormat.getCurrencyInstance(locale);
currencyFormat02.setMinimumFractionDigits(0);
currencyFormat02.setMaximumFractionDigits(2);
currencyFormat02.setGroupingUsed(false);
BigDecimal bd = new BigDecimal("25 or 25,1 or 25,10 or 25,12");
String x =currencyFormat02.format(bd);

x应该像上面那样打印,但实际上并没有。

1
例子很好,但你也需要明确你想要做什么。 - shmosel
我已经更新了问题。 - user1329339
你还没有描述你的目标。 - shmosel
@OleV.V. 是的,这是一个解决方案!感谢您提供它。 - user1329339
3个回答

3
也许不是最高效的方法,但你可以尝试像这样做:

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;

class Main {
  public static void main(String[] args) {
    BigDecimal ex1 = new BigDecimal("25");
    BigDecimal ex2 = new BigDecimal("25.1");
    BigDecimal ex3 = new BigDecimal("25.10");
    BigDecimal ex4 = new BigDecimal("25.12");
    printCustomBigDecimalFormat(ex1);
    printCustomBigDecimalFormat(ex2);
    printCustomBigDecimalFormat(ex3);
    printCustomBigDecimalFormat(ex4);
  }

  public static void printCustomBigDecimalFormat(BigDecimal bd) {
    DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.getDefault());
    symbols.setDecimalSeparator(',');
    DecimalFormat df = new DecimalFormat("##.00", symbols);
    if(containsDecimalPoint(bd)) {
      System.out.println(df.format(bd));
    } else {
      System.out.println(bd);
    }
  }

  private static boolean containsDecimalPoint(BigDecimal bd) {
    return bd.toString().contains(".");
  }
}

输出:

25
25,10
25,10
25,12

Try it here!


1
我喜欢你的示例中的 [mcve] 方面! - GhostCat

1
你需要区分BigDecimal值表示的是“整数”还是“小数”。
类似于:

如下:

BigDecimal someNumber = ...
if (someNumber.toBigIntegerExact()) {
 // go for the 25 kind of formatting
} else {
 // go for the 25.xx kind of formatting

“25.xx”格式的描述可以在这里(或Leonardo的另一个答案中)找到。

0

如果要使用NumberFormat格式化BigDecimal,您需要先设置Locale,可以尝试以下代码:

String strToFormat = "25.10";
Locale loc = new Locale("en","US");

DecimalFormat numFormat = (DecimalFormat)NumberFormat.getInstance(loc);
numFormat.setParseBigDecimal(true);
BigDecimal yourValue = (BigDecimal)numFormat.parse(strToFormat, new ParsePosition(0));

System.out.println("Value : " + yourValue);

结果:

Value : 25.10

1
这将把25格式化为“25,00”。 - GhostCat
1
是的,这不正确。 - user1329339
运行代码后进行了测试编辑并添加了结果。 - Leonardo Leoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接