1 package org.apidesign.apifest08.currency;
3 import static org.apidesign.apifest08.currency.Assert.notNull;
5 import java.math.BigDecimal;
6 import java.math.RoundingMode;
7 import java.util.Currency;
10 * An amount representation. Amount is represented as composition of a value and
13 public final class Amount {
15 private final BigDecimal value;
16 private final Currency currency;
17 private final int scale;
18 private final RoundingMode roundingMode;
20 public static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_EVEN;
22 public Amount(final BigDecimal value, final Currency currency) {
23 notNull(value, "value");
24 notNull(currency, "currency");
26 this.currency = currency;
27 this.scale = currency.getDefaultFractionDigits();
28 this.roundingMode = DEFAULT_ROUNDING;
31 public Amount(final BigDecimal value, final Currency currency, final RoundingMode roundingMode) {
32 notNull(value, "value");
33 notNull(currency, "currency");
34 notNull(roundingMode, "roundingMode");
37 this.currency = currency;
38 this.scale = currency.getDefaultFractionDigits();
39 this.roundingMode = roundingMode;
42 public Amount(final long value, final Currency currency) {
43 this(BigDecimal.valueOf(value), currency);
46 public Amount(final String value, final Currency currency) {
47 this(new BigDecimal(value), currency);
51 * @return the value with scale of the associated currency and rounded by
54 public BigDecimal getValue() {
55 return value.setScale(scale, roundingMode);
59 * @return the raw (no explicit scale, no explicit rounding) value
61 public BigDecimal getRawValue() {
65 public Currency getCurrency() {
69 public int getScale() {
73 public RoundingMode getRoundingMode() {
78 public String toString() {
79 return value + ",- " + currency.toString();