您的位置:首页 > 其它

谈谈如何在程序中储存及处理“价格”

2011-05-31 22:31 302 查看
价格在程序中可以表示为 【货币】+【值】。本文主要谈Java程序。

我们的程序必须可以:

支持多种货币

显示价格

进行排序

进行加,减,乘计算 (尚未发现“除”的需要)

必须知道的几个事实:

所有货币都能用三个字符来表示

各个货币的小数点后位数有不同,现阶段有0,2,或3位:http://www.currency-iso.org/dl_iso_table_a1.xls

Java 的 java.util.Currency 提供getDefaultFractionDigits() 可以得到上面提到的信息

程序中的floating point是无法用来准确储存/计算小数的:http://www.ibm.com/developerworks/java/library/j-jtp0114/

最后一点文章比较长,不必细读,运行以下程序可以简单验证这一点:

double d = 29.0 * 0.01;
System.out.println(d); // 0.29
System.out.println(d*100); // 28.999999999999996
System.out.println((int) (d * 100)); // 28


现在可以开始设计

public abstract class Price implements Cloneable, Serializable, Comparable<Price>{
private String currencyCode;
private long value;

// Getters and setters... not shown here

public Price add(Price p) throws UnsupportedOperationException;
public Price subtract(Price p) throws UnsupportedOperationException;
public Price multiply(double multiplier) throws IllegalArgumentException, UnsupportedOperationException;
public int compareTo(Price p) throws UnsupportedOperationException;    public boolean equals(Price p);
public String toString(Locale locale);
}


其中,算术的实现较直观,不再赘述;

compareTo 是为了实现Comparable,这样List<Price>就可以使用sort来排序;

equals 的实现则定义了价格数值上相等即为相同object,这一点可以根据实际情况修改。(题外:实现equals则必须同时实现hashCode)

以上代码的实现与这里的设计有些小处不同,可以在这里下载:http://code.google.com/p/common-business-objects/source/browse/trunk/com/commbizobj/Price.java

最后总结几点不足以及可以改进的地方:

依赖于Java的java.util.Currency实现。如果需要反映最新的货币变化,则无法控制,必须等待jdk更新。

基于Locale的toString实现得不是很理想,是比较简单的基于Currency.
getSymbol(Locale locale)
,还不足以直接用来显示

可以加入按当前汇率实现货币转换的功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: