谈谈如何在程序中储存及处理“价格”
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/
最后一点文章比较长,不必细读,运行以下程序可以简单验证这一点:
现在可以开始设计
其中,算术的实现较直观,不再赘述;
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.
可以加入按当前汇率实现货币转换的功能
我们的程序必须可以:
支持多种货币
显示价格
进行排序
进行加,减,乘计算 (尚未发现“除”的需要)
必须知道的几个事实:
所有货币都能用三个字符来表示
各个货币的小数点后位数有不同,现阶段有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),还不足以直接用来显示
可以加入按当前汇率实现货币转换的功能
相关文章推荐
- head first C#学习笔记:如何创建事件以及事件处理程序
- 如何处理Windows Forms程序中未处理的异常
- 如何处理Windows Forms程序中未处理的异常
- 如何判断某个事件已经绑定了某个事件处理程序?
- 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑
- 谈谈如何调试程序BUG (vs2012 cocos2dx)
- 批处理程序如何接受多个文件拖入?开启了变量延迟enabledelayedexpansion之后遇到感叹号要怎么处理?
- 谈谈一般处理程序(1)---httpcontext
- 程序无法卸载如何处理
- 删除事件处理程序如何解决
- Android adb.exe程序启动不起来,如何处理
- 示范如何在命令行程序中处理用户中…
- 如何添加Features,处理自己的程序
- 如何解决重复日志问题,谈谈错误用返回值还是用抛异常进行处理
- ABAP--如何暂停其他进程的处理,加速当前程序的处理速度
- 开源ASP.NET程序是如何处理文件编码的-从DotNetNuke看过来
- IIS如何确定请求的处理程序
- 开发网页程序的时候,JS经常报错该如何处理?
- Android程序中价格的处理
- 聊聊如何处理程序中的“分支条件”更加合理