Как правильно отобразить цену до двух десятичных знаков (центов), включая конечные нули в Java? - PullRequest
6 голосов
/ 14 ноября 2009

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

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

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

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

double price = 1.50;

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

$2.5000000000000003

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

$2.5

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

$2.00

Ответы [ 5 ]

19 голосов
/ 14 ноября 2009

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

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

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

14 голосов
/ 14 ноября 2009

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

(РЕДАКТИРОВАТЬ: ... или хорошо реализованный класс Money, как указано в комментарии duffymo, например, классы из денежного модуля JScience или более поздние Joda-Money - который еще не выпущен в качестве официальной версии.)

11 голосов
/ 14 ноября 2009

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

double price = 2.50000000000003;
DecimalFormat formatter = new DecimalFormat("$0.00");
System.out.println(formatter.format(price)); // print: $2.50
4 голосов
/ 14 ноября 2009

Вы пробовали:

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

Это сработает.

0 голосов
/ 31 января 2013
public static String getFormattedData(String actualString) 
    {
        String subString = "0.0";

        if(actualString.contains("."))
        {   
            subString = actualString.substring(actualString.indexOf("."), actualString.trim().length()); 

            if(Double.parseDouble(subString) > 0.0)
                return actualString;
            else
                actualString = actualString.substring(0, actualString.indexOf("."));
        }
        return actualString;
    }
...