在Web应用程序中,我想建模一个具有价格字段的 ItemForSale 。我在其他地方读到浮点数或双精度不应该用于货币字段,因为舍入错误和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;
}
}
这是解析价格字符串的正确方法(由用户输入)吗?我想将消极和无效字符串(例如&#39; abcd&#39;)视为0。
如果有更好的方法,请告诉我
感谢
标记
答案 0 :(得分:4)
为什么要将无效输入视为0?当然,你想告诉用户他们犯了一个错误,而不是把它当作零输入来处理。
如果您正在解析用户输入,那么您可能应该使用DecimalFormat
而不是BigDecimal
构造函数 - 这样它将使用适当的文化信息。 (使用setParseBigDecimal
将DecimalFormat
解析为BigDecimal
而不是double
。)
然后使用:
而不是将BigDecimal值转换为doubleif (price.compareTo(BigDecimal.ZERO) < 0)
我建议你应该向用户说明三种不同的状态:
答案 1 :(得分:3)
您最昂贵的物品有多贵?如果它低于21,474,836.47美元,您可以安全地将价格表示为正常int
的分数。
您是正确的,以避免float
和double
。通常的解决方案是使用int
或long
来保存分数并相应地调整输出格式。通常没有必要进入BigDecimal
的复杂性和速度问题。
答案 2 :(得分:1)
这是我的建议:
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;
}
}