Форматирование чисел с помощью DecimalFormat

Я пытаюсь отформатировать цены с помощью DecimalFormat, но это не работает для всех вариантов.

DecimalFormat df = new DecimalFormat("0.##")
df.format(7.8)
df.format(85.0)

печать

7.80

и

85

но "7.79999" форматируется как "7.8", а не"7.80". Я пробовал делать вещи таким образом

DecimalFormat df = new DecimalFormat("0.00")

чтобы заставить два dp, но затем "85.0" форматируется как "85.00", а не "85"!

есть ли способ захватить все вариации, так что цены печатаются либо как#,##, либо #.##? Для пример:

5, 55, 5.55, 5.50, 500, 500.40

5 ответов


Это, похоже, не решается одним formatter. Я предлагаю вам использовать и заменить ".00" С пустой строкой.

public static String myFormat(double number) {
  DecimalFormat df = new DecimalFormat("0.00");
  return df.format(number).replaceAll("\.00$", "");
}

есть небольшая разница между этими двумя форматами. Этот.#" ## "означает, что он будет печатать число с максимальными двумя десятичными знаками, тогда как"#.00 " означает, что он всегда будет отображать два десятичных знака, и если десятичные знаки меньше двух, он заменит их нулями. см. пример ниже с выводом.

public static final DecimalFormat df1 = new DecimalFormat( "#.##" );
public static final DecimalFormat df2 = new DecimalFormat( "#.00" );

System.out.println(df1.format(7.80));
System.out.println(df1.format(85));
System.out.println(df1.format(85.786));

System.out.println(df2.format(7.80));
System.out.println(df2.format(85));
System.out.println(df2.format(85.786));

и выход будет

7.8
85
85.79

7.80
85.00
85.79

Я не думаю, что это возможно, по крайней мере, не с Java SE formatters. Вам нужно сделать пользовательский форматтер. Я бы сделал это так

String res = df.format(number).replace(".00", "");

вместо этого используйте класс BigDecimal number:

например, если n является BigDecimal, тогда вы можете использовать

String s = NumberFormat.getCurrencyInstance().format(n);

кстати, лучше всего использовать BigDecimal при работе с деньгами.


System.out.println(new java.text.DecimalFormat("#.##").format(5.00));

это будет печатать 5

System.out.println(new java.text.DecimalFormat("#.00").format(500.401));

это будет печатать 500.40