package com.avaje.tests.model.ivo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
/**
* A representation of a Rate (like Tax or Discount) that is typically
* used to multiple against an amount (like Money).
*
* A Rate effectively wraps a BigDecimal with associated control over
* precision and scale.
*
* Rates are typically used to multiple or divide against an amount.
* For example, you can't ADD a Rate to Money.
*
*
* @author rbygrave
*/
public final class Rate implements Comparable, Serializable {
private static final long serialVersionUID = 1L;
public static final Rate ZERO = new Rate(BigDecimal.ZERO);
public static final Rate ONE = new Rate(BigDecimal.ONE);
private final BigDecimal value;
public Rate(BigDecimal value) {
if (value == null) {
throw new NullPointerException("value can not be null");
}
this.value = value;
}
public Rate(double val) {
this(BigDecimal.valueOf(val));
}
public Rate(String val) {
this(new BigDecimal(val));
}
public String toString() {
return value.toString();
}
public int compareTo(Rate o) {
return value.compareTo(o.value);
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Rate) {
// use BigDecimal.compareTo to handle scale differences
return value.compareTo(((Rate) obj).getValue()) == 0;
}
return false;
}
public BigDecimal getValue() {
return value;
}
public Rate subtract(Rate amt) {
BigDecimal b = value.subtract(amt.value);
return new Rate(b);
}
public Rate subtract(Rate amt, MathContext ctx) {
BigDecimal b = value.subtract(amt.value, ctx);
return new Rate(b);
}
public Rate add(Rate amt) {
BigDecimal b = value.add(amt.value);
return new Rate(b);
}
public Rate add(Rate amt, MathContext ctx) {
BigDecimal b = value.add(amt.value, ctx);
return new Rate(b);
}
/**
* A Rate times Money amount returns Money.
*/
public Money times(Money amount) {
return multiply(amount);
}
public Money multiply(Money amount) {
BigDecimal b = value.multiply(amount.getAmount());
return new Money(b);
}
public Rate multiply(Rate m) {
return multiply(m.value);
}
public Rate multiply(int val) {
return multiply(BigDecimal.valueOf(val));
}
public Rate multiply(float val) {
return multiply(BigDecimal.valueOf(val));
}
public Rate multiply(double val) {
return multiply(BigDecimal.valueOf(val));
}
public Rate multiply(BigDecimal m) {
BigDecimal b = value.multiply(m);
return new Rate(b);
}
public Rate divide(BigDecimal divisor) {
BigDecimal b = value.divide(divisor);
return new Rate(b);
}
public Rate divide(BigDecimal divisor, MathContext ctx) {
BigDecimal b = value.divide(divisor, ctx);
return new Rate(b);
}
}