task4/solution06/src/org/apidesign/apifest08/currency/Amount.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 11 Oct 2008 23:38:46 +0200
changeset 61 58ec6da75f6f
parent 45 task3/solution06/src/org/apidesign/apifest08/currency/Amount.java@251d0ed461fb
permissions -rw-r--r--
Copying structure for task4
     1 package org.apidesign.apifest08.currency;
     2 
     3 import static org.apidesign.apifest08.currency.Assert.notNull;
     4 
     5 import java.math.BigDecimal;
     6 import java.math.RoundingMode;
     7 import java.util.Currency;
     8 
     9 /**
    10  * An amount representation. Amount is represented as composition of a value and 
    11  * a currency.
    12  */
    13 public final class Amount {
    14 	
    15 	private final BigDecimal value;
    16 	private final Currency currency;
    17 	private final int scale;
    18 	private final RoundingMode roundingMode;
    19 	
    20 	public static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_EVEN; 
    21 	
    22 	public Amount(final BigDecimal value, final Currency currency) {
    23 		notNull(value, "value");
    24 		notNull(currency, "currency");
    25 		this.value = value;
    26 		this.currency = currency;
    27 		this.scale = currency.getDefaultFractionDigits();
    28 		this.roundingMode = DEFAULT_ROUNDING;
    29 	}
    30 	
    31 	public Amount(final BigDecimal value, final Currency currency, final RoundingMode roundingMode) {
    32 		notNull(value, "value");
    33 		notNull(currency, "currency");
    34 		notNull(roundingMode, "roundingMode");
    35 		
    36 		this.value = value;
    37 		this.currency = currency;
    38 		this.scale = currency.getDefaultFractionDigits();
    39 		this.roundingMode = roundingMode;
    40 	}
    41 	
    42 	public Amount(final long value, final Currency currency) {
    43 		this(BigDecimal.valueOf(value), currency);
    44 	}
    45 	
    46 	public Amount(final String value, final Currency currency) {
    47 		this(new BigDecimal(value), currency);
    48 	}
    49 	
    50 	/**
    51 	 * @return the value with scale of the associated currency and rounded by 
    52 	 * the rounding mode. 
    53 	 */
    54 	public BigDecimal getValue() {
    55 		return value.setScale(scale, roundingMode);
    56 	}
    57 	
    58 	/**
    59 	 * @return the raw (no explicit scale, no explicit rounding) value 
    60 	 */
    61 	public BigDecimal getRawValue() {
    62 		return value;
    63 	}
    64 	
    65 	public Currency getCurrency() {
    66 		return currency;
    67 	}
    68 
    69 	public int getScale() {
    70 		return scale;
    71 	}
    72 
    73 	public RoundingMode getRoundingMode() {
    74 		return roundingMode;
    75 	}
    76 
    77 	@Override
    78 	public String toString() {
    79 		return value + ",- " + currency.toString();
    80 	}	
    81 }