реализация цены товара с использованием BigDecimal в Java - PullRequest
1 голос
/ 30 июля 2011

В веб-приложении я хочу смоделировать ItemForSale , который имеет поле цены. В других местах я читал, что float или double не следует использовать для полей валюты из-за ошибок округления, а BigDecimal - правильный тип.для этой цели. Я создал эти классы

class ItemForSale {
    private String name;
    private BigDecimal price;
    ...
}

class MyUtils{
    ...
    public static BigDecimal parsePriceOfItem(String priceStr){
        BigDecimal price;
        BigDecimal zero = new BigDecimal(0);
        try{
            price = new BigDecimal(priceStr);
        }catch(NumberFormatException nfe){
            price = zero;
        }
        if(price.doubleValue() < zero.doubleValue()){
            price = zero;
        }
        return price;
        }
    }

Является ли это правильным способом для анализа строки цены (введенной пользователем)? Я хотел обработать отрицательные и недопустимые строки (скажем, 'abcd') как 0.

Если есть лучший способ, скажите, пожалуйста,

спасибо

оценка

Ответы [ 3 ]

4 голосов
/ 30 июля 2011

Почему вы хотите рассматривать неверный ввод как 0?Конечно, вы хотели бы сказать пользователю, что он допустил ошибку, а не считать, что он набрал ноль.

Если вы анализируете пользовательский ввод, вам, вероятно, следует использовать DecimalFormat вместо BigDecimal конструктора - таким образом он будет использовать соответствующую культурную информацию.(Используйте setParseBigDecimal, чтобы DecimalFormat проанализировать BigDecimal вместо double.)

Затем, вместо преобразования значений BigDecimal в double, используйте:

if (price.compareTo(BigDecimal.ZERO) < 0)

Iпредложил бы указать пользователю три различных состояния:

  • Число не может быть проанализировано
  • Число было отрицательным (или, возможно, недействительным каким-либо другим способом; у вас естьмаксимальное значение или максимальное количество цифр)?
  • Номер был действительным
3 голосов
/ 30 июля 2011

Сколько стоит ваш самый дорогой товар? Если она меньше 21 474 836,47 долларов США, вы можете смело выражать цену в виде числа центов, удерживаемых в обычном int.

Вы правы, чтобы избежать float и double. Обычное решение состоит в том, чтобы использовать int или long, чтобы удерживать количество центов и соответственно корректировать форматирование вывода. Как правило, нет необходимости вдаваться в сложности и проблемы со скоростью BigDecimal.

1 голос
/ 30 июля 2011

Вот мое предложение:

public static BigDecimal parsePriceOfItem(String priceStr) {
    try {
        BigDecimal price = new BigDecimal(priceStr);
        return price.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : price;
    } catch(NumberFormatException nfe) {
        return BigDecimal.ZERO;
    }
}
...