package org.tests.model.ivo; import java.io.Serializable; import java.math.BigDecimal; import java.math.MathContext; import java.util.Iterator; /** * A representation of Money effectively wrapping BigDecimal. * <p> * <p> * </p> * * @author rbygrave */ public final class Money implements Comparable<Money>, Serializable { private static final long serialVersionUID = 1L; public static final Money ZERO = new Money(BigDecimal.ZERO); private final BigDecimal amount; public Money(BigDecimal amount) { if (amount == null) { throw new NullPointerException("amount can not be null"); } this.amount = amount; } public Money(double val) { this(BigDecimal.valueOf(val)); } public Money(String val) { this(new BigDecimal(val)); } @Override public String toString() { return amount.toString(); } @Override public int hashCode() { return amount.hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof Money) { // use BigDecimal.compareTo to handle scale differences return amount.compareTo(((Money) obj).getAmount()) == 0; } return false; } @Override public int compareTo(Money o) { return amount.compareTo(o.amount); } public BigDecimal getAmount() { return amount; } public Money subtract(Money amt) { BigDecimal b = amount.subtract(amt.amount); return new Money(b); } public Money subtract(Money amt, MathContext ctx) { BigDecimal b = amount.subtract(amt.amount, ctx); return new Money(b); } public Money add(Money amt) { BigDecimal b = amount.add(amt.amount); return new Money(b); } public Money add(Money amt, MathContext ctx) { BigDecimal b = amount.add(amt.amount, ctx); return new Money(b); } public Money multiply(Money m) { return multiply(m.amount); } public Money multiply(int val) { return multiply(BigDecimal.valueOf(val)); } public Money multiply(float val) { return multiply(BigDecimal.valueOf(val)); } public Money multiply(double val) { return multiply(BigDecimal.valueOf(val)); } public Money multiply(BigDecimal m) { BigDecimal b = amount.multiply(m); return new Money(b); } public Money divide(BigDecimal divisor) { BigDecimal b = amount.divide(divisor); return new Money(b); } public Money divide(BigDecimal divisor, MathContext ctx) { BigDecimal b = amount.divide(divisor, ctx); return new Money(b); } public static Money sum(Money... m) { BigDecimal t = BigDecimal.ZERO; for (Money money : m) { t = t.add(money.amount); } return new Money(t); } public static Money sum(Iterator<Money> it) { BigDecimal t = BigDecimal.ZERO; while (it.hasNext()) { t = t.add(it.next().amount); } return new Money(t); } public static Money sum(Iterator<Money> it, MathContext ctx) { BigDecimal t = BigDecimal.ZERO; while (it.hasNext()) { t = t.add(it.next().amount, ctx); } return new Money(t); } }