Как правильно отображать цену до двух знаков после запятой (центов), включая конечные нули в Java?

Есть хороший вопрос об округлении десятичных знаков в Java здесь. Но мне было интересно, как я могу включить конечные нули для отображения цен в моей программе, например: 1,50 доллара, 1,00 доллара.

Простое решение

String.format("%.2g%n", 0.912385);

работает просто отлично, но опускает конечный ноль, если он находится в последнем десятичном разряде. Проблема возникает в моей программе, хотя я использую только такие выражения:

double price = 1.50;

Когда я делаю расчеты с разными ценами (сложение, умножение и т. д.), результат в основном отображается так:

$2.5000000000000003

Таким образом, использование String.format отлично подходит для этой цели, но оно усекает приведенный выше пример до

$2.5

Есть ли правильный способ показать конечный ноль во втором десятичном знаке? Или оба нуля, если результат вычисления должен быть

$2.00

person denchr    schedule 14.11.2009    source источник
comment
Как правило, никогда не используйте числа с плавающей запятой для представления валюты. Вместо этого рассмотрите возможность использования целого числа для центов/пенсов.   -  person Pool    schedule 14.11.2009


Ответы (4)


Я бы порекомендовал вам сделать это:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
double price = 2.50000000000003;
System.out.println(currencyFormatter.format(price));

Это также имеет то преимущество, что оно зависит от локали. Это сработает, например, если вы находитесь в зоне евро, а не в США.

person duffymo    schedule 14.11.2009
comment
Спасибо, искал что-то подобное! Я не знал о методе getCurrencyInstance(). - person denchr; 14.11.2009

В то время как другие ответы совершенно верны (особенно ответ duffymo), у вас гораздо большая проблема, чем форматирование дисплея. На самом деле вы используете совершенно неправильный тип денежной суммы, которая является дискретным значением. Вместо double вам действительно следует рассмотреть возможность использования java.lang.BigDecimal< /а>.

(EDIT: ... или хорошо реализованный класс Money, как указал duffymo в комментарии, например, классы из JScience денежный модуль или более новый Joda-Money — официальная версия которого еще не выпущена.)

person Pascal Thivent    schedule 14.11.2009
comment
+1 - отличная точка. Либо BigDecimal, либо правильный класс Money. - person duffymo; 14.11.2009
comment
Спасибо за предложение. Дело принято :) - person denchr; 14.11.2009

Вероятно, это можно сделать с помощью String.format(...), но вы можете использовать DecimalFormat:

double price = 2.50000000000003;
DecimalFormat formatter = new DecimalFormat("$0.00");
System.out.println(formatter.format(price)); // print: $2.50
person Bart Kiers    schedule 14.11.2009

Ты пытался:

String s = String.format("$%.2f", 2.50);

Это поможет.

person dustmachine    schedule 14.11.2009
comment
Хотя мой ответ выполняет то, что вы просили, лучшим решением, как отмечали другие, является использование BigDecimal или истинного класса Money. - person dustmachine; 08.09.2011