package com.mygeopay.core.coins; import com.mygeopay.core.util.Currencies; import com.mygeopay.core.util.MonetaryFormat; import org.bitcoinj.core.Coin; import java.math.BigInteger; import java.util.HashMap; import javax.annotation.Nullable; /** * @author John L. Jegutanis */ public class FiatType implements ValueType { public static final int SMALLEST_UNIT_EXPONENT = 8; public static final MonetaryFormat PLAIN_FORMAT = new MonetaryFormat().noCode() .minDecimals(0).repeatOptionalDecimals(1, SMALLEST_UNIT_EXPONENT); public static final MonetaryFormat FRIENDLY_FORMAT = new MonetaryFormat().noCode() .minDecimals(2).optionalDecimals(2, 2, 2).postfixCode(); private static final HashMap<String, FiatType> types = new HashMap<>(); private final String name; private final String currencyCode; private transient Value oneCoin; private transient MonetaryFormat friendlyFormat; public FiatType(final String currencyCode, @Nullable final String name) { this.name = name != null ? name : ""; this.currencyCode = currencyCode; } public static FiatType get(String currencyCode) { if (!types.containsKey(currencyCode)) { types.put(currencyCode, new FiatType(currencyCode, Currencies.CURRENCY_NAMES.get(currencyCode))); } return types.get(currencyCode); } @Override public String getName() { return name; } @Override public String getSymbol() { return currencyCode; } @Override public int getUnitExponent() { return SMALLEST_UNIT_EXPONENT; } @Override public Value oneCoin() { if (oneCoin == null) { BigInteger units = BigInteger.TEN.pow(getUnitExponent()); oneCoin = Value.valueOf(this, units.longValue()); } return oneCoin; } @Override public Value minNonDust() { return value(1); } @Override public Value value(Coin coin) { return Value.valueOf(this, coin); } @Override public Value value(long units) { return Value.valueOf(this, units); } @Override public Value value(String string) { return Value.parse(this, string); } @Override public MonetaryFormat getMonetaryFormat() { if (friendlyFormat == null) { friendlyFormat = FRIENDLY_FORMAT.code(0, currencyCode); } return friendlyFormat; } @Override public MonetaryFormat getPlainFormat() { return PLAIN_FORMAT; } @Override public boolean isEquals(ValueType o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; return currencyCode.equals(o.getSymbol()); } @Override public String toString() { return "Fiat {" + "name='" + name + '\'' + ", currencyCode='" + currencyCode + '}'; } }