Class Money
- All Implemented Interfaces:
Serializable
,Comparable
货币类中封装了货币金额和币种。目前金额在内部是long类型表示, 单位是所属币种的最小货币单位(对人民币是分)。
目前,货币实现了以下主要功能:
- 支持货币对象与double(float)/long(int)/String/BigDecimal之间相互转换。
- 货币类在运算中提供与JDK中的BigDecimal类似的运算接口, BigDecimal的运算接口支持任意指定精度的运算功能,能够支持各种 可能的财务规则。
- 货币类在运算中也提供一组简单运算接口,使用这组运算接口,则在 精度处理上使用缺省的处理规则。
- 推荐使用Money,不建议直接使用BigDecimal的原因之一在于, 使用BigDecimal,同样金额和币种的货币使用BigDecimal存在多种可能 的表示,例如:new BigDecimal("10.5")与new BigDecimal("10.50") 不相等,因为scale不等。使得Money类,同样金额和币种的货币只有 一种表示方式,new Money("10.5")和new Money("10.50")应该是相等的。
- 不推荐直接使用BigDecimal的另一原因在于, BigDecimal是Immutable, 一旦创建就不可更改,对BigDecimal进行任意运算都会生成一个新的 BigDecimal对象,因此对于大批量统计的性能不够满意。Money类是 mutable的,对大批量统计提供较好的支持。
- 提供基本的格式化功能。
- Money类中不包含与业务相关的统计功能和格式化功能。业务相关的功能 建议使用utility类来实现。
- Money类实现了Serializable接口,支持作为远程调用的参数和返回值。
- Money类实现了equals和hashCode方法。
- See Also:
-
Field Summary
Fields -
Constructor Summary
ConstructorsConstructorDescriptionMoney()
缺省构造器。Money
(double amount) 构造器。构造器。Money
(long cent) 构造器。Money
(long yuan, int cent) 构造器。构造器。构造器。构造器。构造器。Money
(BigDecimal amount) 构造器。Money
(BigDecimal amount, int roundingMode) 构造器。Money
(BigDecimal amount, Currency currency) 构造器。Money
(BigDecimal amount, Currency currency, int roundingMode) 构造器。 -
Method Summary
Modifier and TypeMethodDescription货币加法。货币累加。Money[]
allocate
(int targets) 货币分配。Money[]
allocate
(long[] ratios) 货币分配。protected void
assertSameCurrencyAs
(Money other) 断言本货币对象与另一货币对象是否具有相同的币种。int
货币比较。int
对象比较。divide
(double val) 货币除法。divide
(BigDecimal val) 货币除法。divide
(BigDecimal val, int roundingMode) 货币除法。divideBy
(double val) 货币累除。divideBy
(BigDecimal val) 货币累除。divideBy
(BigDecimal val, int roundingMode) 货币累除。dump()
生成本对象内部变量的字符串表示,用于调试。boolean
判断本货币对象与另一货币对象是否相等。boolean
判断本货币对象与另一对象是否相等。获取本货币对象代表的金额数。long
getCent()
获取本货币对象代表的金额数。int
获取本货币币种的元/分换算比率。Deprecated.use getCurrencyCode()获取本货币对象代表的币种代码得到显示用的货币单位根据地区得到显示用的货币单位 如Locale是zh_CN,返回“元”,如Locale是zh_HK返回“圓”boolean
greaterThan
(Money other) 货币比较。int
hashCode()
计算本货币对象的杂凑值。static void
multiply
(double val) 货币乘法。multiply
(long val) 货币乘法。multiply
(BigDecimal val) 货币乘法。multiply
(BigDecimal val, int roundingMode) 货币乘法。multiplyBy
(double val) 货币累乘。multiplyBy
(long val) 货币累乘。multiplyBy
(BigDecimal val) 货币累乘。multiplyBy
(BigDecimal val, int roundingMode) 货币累乘。protected Money
newMoneyWithSameCurrency
(long cent1) 创建一个币种相同,具有指定金额的货币对象。protected long
rounding
(BigDecimal val, int roundingMode) 对BigDecimal型的值按指定取整方式取整。void
setAmount
(BigDecimal amount) 设置本货币对象代表的金额数。void
setCent
(long cent) 货币减法。subtractFrom
(Money other) 货币累减。toString()
生成本对象的缺省字符串表示
-
Field Details
-
DEFAULT_CURRENCY_CODE
缺省的币种代码,为CNY(人民币)。- See Also:
-
DEFAULT_ROUNDING_MODE
public static final int DEFAULT_ROUNDING_MODE缺省的取整模式,为BigDecimal.ROUND_HALF_EVEN (四舍五入,当小数为0.5时,则取最近的偶数)。
- See Also:
-
CURRENCY_DISPLAY_UNIT_MAP
保存货币单位的map,用来显示货币单位,如元,美元等 -
ZERO
必须定义在后面(依赖前面的静态变量)
-
-
Constructor Details
-
Money
public Money()缺省构造器。创建一个具有缺省金额(0)和缺省币种的货币对象。
-
Money
public Money(long yuan, int cent) 构造器。创建一个具有金额
yuan
元cent分和缺省币种的货币对象。
- Parameters:
yuan
- 金额元数。cent
- 金额分数。
-
Money
public Money(long cent) 构造器。创建一个具有金额
yuan
元cent分和缺省币种的货币对象。
- Parameters:
cent
- 金额分数。
-
Money
构造器。创建一个具有金额
yuan
元cent
分和指定币种的货币对象。- Parameters:
yuan
- 金额元数。cent
- 金额分数。currency
-
-
Money
构造器。创建一个具有金额
amount
元和缺省币种的货币对象。- Parameters:
amount
- 金额,以元为单位。
-
Money
构造器。创建一个具有金额
amount
元和指定币种currency
的货币对象。- Parameters:
amount
- 金额,以元为单位。currency
- 币种。
-
Money
构造器。创建一个具有金额
amount
元和指定币种currency
的货币对象。 如果金额不能转换为整数分,则使用指定的取整模式roundingMode
取整。- Parameters:
amount
- 金额,以元为单位。currency
- 币种。roundingMode
- 取整模式。
-
Money
public Money(double amount) 构造器。创建一个具有参数
amount
指定金额和缺省币种的货币对象。 如果金额不能转换为整数分,则使用四舍五入方式取整。注意:由于double类型运算中存在误差,使用四舍五入方式取整的 结果并不确定,因此,应尽量避免使用double类型创建货币类型。 例:
assertEquals(999, Math.round(9.995 * 100)); assertEquals(1000, Math.round(999.5)); money = new Money((9.995)); assertEquals(999, money.getCent()); money = new Money(10.005); assertEquals(1001, money.getCent());
- Parameters:
amount
- 金额,以元为单位。
-
Money
构造器。创建一个具有金额
amount
和指定币种的货币对象。 如果金额不能转换为整数分,则使用四舍五入方式取整。注意:由于double类型运算中存在误差,使用四舍五入方式取整的 结果并不确定,因此,应尽量避免使用double类型创建货币类型。 例:
assertEquals(999, Math.round(9.995 * 100)); assertEquals(1000, Math.round(999.5)); money = new Money((9.995)); assertEquals(999, money.getCent()); money = new Money(10.005); assertEquals(1001, money.getCent());
- Parameters:
amount
- 金额,以元为单位。currency
- 币种。
-
Money
构造器。创建一个具有金额
amount
和缺省币种的货币对象。 如果金额不能转换为整数分,则使用缺省取整模式DEFAULT_ROUNDING_MODE
取整。- Parameters:
amount
- 金额,以元为单位。
-
Money
构造器。创建一个具有参数
amount
指定金额和缺省币种的货币对象。 如果金额不能转换为整数分,则使用指定的取整模式roundingMode
取整。- Parameters:
amount
- 金额,以元为单位。roundingMode
- 取整模式
-
Money
构造器。创建一个具有金额
amount
和指定币种的货币对象。 如果金额不能转换为整数分,则使用缺省的取整模式DEFAULT_ROUNDING_MODE
进行取整。- Parameters:
amount
- 金额,以元为单位。currency
- 币种
-
Money
构造器。创建一个具有金额
amount
和指定币种的货币对象。 如果金额不能转换为整数分,则使用指定的取整模式roundingMode
取整。- Parameters:
amount
- 金额,以元为单位。currency
- 币种。roundingMode
- 取整模式。
-
-
Method Details
-
getAmount
获取本货币对象代表的金额数。- Returns:
- 金额数,以元为单位。
-
setAmount
设置本货币对象代表的金额数。- Parameters:
amount
- 金额数,以元为单位。
-
getCent
public long getCent()获取本货币对象代表的金额数。- Returns:
- 金额数,以分为单位。
-
getCurrency
Deprecated.use getCurrencyCode()获取本货币对象代表的币种。- Returns:
- 本货币对象所代表的币种。
-
getCurrencyCode
获取本货币对象代表的币种代码- Returns:
- 币种代码
-
getCentFactor
public int getCentFactor()获取本货币币种的元/分换算比率。- Returns:
- 本货币币种的元/分换算比率。
-
equals
判断本货币对象与另一对象是否相等。本货币对象与另一对象相等的充分必要条件是:
- 另一对象也属货币对象类。
- 金额相同。
- 币种相同。
-
equals
判断本货币对象与另一货币对象是否相等。本货币对象与另一货币对象相等的充分必要条件是:
- 金额相同。
- 币种相同。
- Parameters:
other
- 待比较的另一货币对象。- Returns:
true
表示相等,false
表示不相等。
-
hashCode
public int hashCode()计算本货币对象的杂凑值。 -
compareTo
对象比较。比较本对象与另一对象的大小。 如果待比较的对象的类型不是
Money
,则抛出java.lang.ClassCastException
。 如果待比较的两个货币对象的币种不同,则抛出java.lang.IllegalArgumentException
。 如果本货币对象的金额少于待比较货币对象,则返回-1。 如果本货币对象的金额等于待比较货币对象,则返回0。 如果本货币对象的金额大于待比较货币对象,则返回1。- Specified by:
compareTo
in interfaceComparable
- Parameters:
other
- 另一对象。- Returns:
- -1表示小于,0表示等于,1表示大于。
- Throws:
ClassCastException
- 待比较货币对象不是Money
。 IllegalArgumentException 待比较货币对象与本货币对象的币种不同。- See Also:
-
compareTo
货币比较。比较本货币对象与另一货币对象的大小。 如果待比较的两个货币对象的币种不同,则抛出
java.lang.IllegalArgumentException
。 如果本货币对象的金额少于待比较货币对象,则返回-1。 如果本货币对象的金额等于待比较货币对象,则返回0。 如果本货币对象的金额大于待比较货币对象,则返回1。- Parameters:
other
- 另一对象。- Returns:
- -1表示小于,0表示等于,1表示大于。
- Throws:
IllegalArgumentException
- 待比较货币对象与本货币对象的币种不同。
-
greaterThan
货币比较。判断本货币对象是否大于另一货币对象。 如果待比较的两个货币对象的币种不同,则抛出
java.lang.IllegalArgumentException
。 如果本货币对象的金额大于待比较货币对象,则返回true,否则返回false。- Parameters:
other
- 另一对象。- Returns:
- true表示大于,false表示不大于(小于等于)。
- Throws:
IllegalArgumentException
- 待比较货币对象与本货币对象的币种不同。
-
add
货币加法。如果两货币币种相同,则返回一个新的相同币种的货币对象,其金额为 两货币对象金额之和,本货币对象的值不变。 如果两货币对象币种不同,抛出
java.lang.IllegalArgumentException
。- Parameters:
other
- 作为加数的货币对象。- Returns:
- 相加后的结果。
- Throws:
IllegalArgumentException
- 如果本货币对象与另一货币对象币种不同。
-
addTo
货币累加。如果两货币币种相同,则本货币对象的金额等于两货币对象金额之和,并返回本货币对象的引用。 如果两货币对象币种不同,抛出
java.lang.IllegalArgumentException
。- Parameters:
other
- 作为加数的货币对象。- Returns:
- 累加后的本货币对象。
- Throws:
IllegalArgumentException
- 如果本货币对象与另一货币对象币种不同。
-
subtract
货币减法。如果两货币币种相同,则返回一个新的相同币种的货币对象,其金额为 本货币对象的金额减去参数货币对象的金额。本货币对象的值不变。 如果两货币币种不同,抛出
java.lang.IllegalArgumentException
。- Parameters:
other
- 作为减数的货币对象。- Returns:
- 相减后的结果。
- Throws:
IllegalArgumentException
- 如果本货币对象与另一货币对象币种不同。
-
subtractFrom
货币累减。如果两货币币种相同,则本货币对象的金额等于两货币对象金额之差,并返回本货币对象的引用。 如果两货币币种不同,抛出
java.lang.IllegalArgumentException
。- Parameters:
other
- 作为减数的货币对象。- Returns:
- 累减后的本货币对象。
- Throws:
IllegalArgumentException
- 如果本货币对象与另一货币对象币种不同。
-
multiply
货币乘法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额乘以乘数。 本货币对象的值不变。
- Parameters:
val
- 乘数- Returns:
- 乘法后的结果。
-
multiplyBy
货币累乘。本货币对象金额乘以乘数,并返回本货币对象。
- Parameters:
val
- 乘数- Returns:
- 累乘后的本货币对象。
-
multiply
货币乘法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额乘以乘数。 本货币对象的值不变。如果相乘后的金额不能转换为整数分,则四舍五入。
- Parameters:
val
- 乘数- Returns:
- 相乘后的结果。
-
multiplyBy
货币累乘。本货币对象金额乘以乘数,并返回本货币对象。 如果相乘后的金额不能转换为整数分,则使用四舍五入。
- Parameters:
val
- 乘数- Returns:
- 累乘后的本货币对象。
-
multiply
货币乘法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额乘以乘数。 本货币对象的值不变。如果相乘后的金额不能转换为整数分,使用缺省的取整模式
DEFUALT_ROUNDING_MODE
进行取整。- Parameters:
val
- 乘数- Returns:
- 相乘后的结果。
-
multiplyBy
货币累乘。本货币对象金额乘以乘数,并返回本货币对象。 如果相乘后的金额不能转换为整数分,使用缺省的取整方式
DEFUALT_ROUNDING_MODE
进行取整。- Parameters:
val
- 乘数- Returns:
- 累乘后的结果。
-
multiply
货币乘法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额乘以乘数。 本货币对象的值不变。如果相乘后的金额不能转换为整数分,使用指定的取整方式
roundingMode
进行取整。- Parameters:
val
- 乘数roundingMode
- 取整方式- Returns:
- 相乘后的结果。
-
multiplyBy
货币累乘。本货币对象金额乘以乘数,并返回本货币对象。 如果相乘后的金额不能转换为整数分,使用指定的取整方式
roundingMode
进行取整。- Parameters:
val
- 乘数roundingMode
- 取整方式- Returns:
- 累乘后的结果。
-
divide
货币除法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额除以除数。 本货币对象的值不变。如果相除后的金额不能转换为整数分,使用四舍五入方式取整。
- Parameters:
val
- 除数- Returns:
- 相除后的结果。
-
divideBy
货币累除。本货币对象金额除以除数,并返回本货币对象。 如果相除后的金额不能转换为整数分,使用四舍五入方式取整。
- Parameters:
val
- 除数- Returns:
- 累除后的结果。
-
divide
货币除法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额除以除数。 本货币对象的值不变。如果相除后的金额不能转换为整数分,使用缺省的取整模式
DEFAULT_ROUNDING_MODE
进行取整。- Parameters:
val
- 除数- Returns:
- 相除后的结果。
-
divide
货币除法。返回一个新的货币对象,币种与本货币对象相同,金额为本货币对象的金额除以除数。 本货币对象的值不变。如果相除后的金额不能转换为整数分,使用指定的取整模式
roundingMode
进行取整。- Parameters:
val
- 除数roundingMode
- 取整- Returns:
- 相除后的结果。
-
divideBy
货币累除。本货币对象金额除以除数,并返回本货币对象。 如果相除后的金额不能转换为整数分,使用缺省的取整模式
DEFAULT_ROUNDING_MODE
进行取整。- Parameters:
val
- 除数- Returns:
- 累除后的结果。
-
divideBy
货币累除。本货币对象金额除以除数,并返回本货币对象。 如果相除后的金额不能转换为整数分,使用指定的取整模式
roundingMode
进行取整。- Parameters:
val
- 除数roundingMode
-- Returns:
- 累除后的结果。
-
allocate
货币分配。将本货币对象尽可能平均分配成
targets
份。 如果不能平均分配尽,则将零头放到开始的若干份中。分配 运算能够确保不会丢失金额零头。- Parameters:
targets
- 待分配的份数- Returns:
- 货币对象数组,数组的长度与分配份数相同,数组元素 从大到小排列,所有货币对象的金额最多只相差1分。
-
allocate
货币分配。将本货币对象按照规定的比例分配成若干份。分配所剩的零头 从第一份开始顺序分配。分配运算确保不会丢失金额零头。
- Parameters:
ratios
- 分配比例数组,每一个比例是一个长整型,代表 相对于总数的相对数。- Returns:
- 货币对象数组,数组的长度与分配比例数组的长度相同。
-
toString
生成本对象的缺省字符串表示 -
assertSameCurrencyAs
断言本货币对象与另一货币对象是否具有相同的币种。如果本货币对象与另一货币对象具有相同的币种,则方法返回。 否则抛出运行时异常
java.lang.IllegalArgumentException
。- Parameters:
other
- 另一货币对象- Throws:
IllegalArgumentException
- 如果本货币对象与另一货币对象币种不同。
-
rounding
对BigDecimal型的值按指定取整方式取整。- Parameters:
val
- 待取整的BigDecimal值roundingMode
- 取整方式- Returns:
- 取整后的long型值
-
newMoneyWithSameCurrency
创建一个币种相同,具有指定金额的货币对象。- Parameters:
cent1
- 金额,以分为单位- Returns:
- 一个新建的币种相同,具有指定金额的货币对象
-
dump
生成本对象内部变量的字符串表示,用于调试。- Returns:
- 本对象内部变量的字符串表示。
-
setCent
public void setCent(long cent) - Parameters:
cent
- The cent to set.
-
getDisplayUnit
得到显示用的货币单位- Returns:
- 显示用的单位,比如“元”,“美元”
-
getDisplayUnit
根据地区得到显示用的货币单位 如Locale是zh_CN,返回“元”,如Locale是zh_HK返回“圓”- Parameters:
e
- 需要得到的地区- Returns:
- 显示用的单位,比如“元”,“美元”
-
main
-