package com.googlecode.aviator.runtime.type; import java.math.BigDecimal; import java.util.Map; import com.googlecode.aviator.AviatorEvaluator; /** * Aviator Big Decimal * * @since 2.3.0 * @author dennis<killme2008@gmail.com> * */ public class AviatorDecimal extends AviatorNumber { public AviatorDecimal(Number number) { super(number); } public static final AviatorDecimal valueOf(BigDecimal d) { return new AviatorDecimal(d); } public static final AviatorDecimal valueOf(String d) { return new AviatorDecimal(new BigDecimal(d, AviatorEvaluator.getMathContext())); } @Override public AviatorObject innerSub(AviatorNumber other) { switch (other.getAviatorType()) { case Double: return AviatorDouble.valueOf(this.doubleValue() - other.doubleValue()); default: return AviatorDecimal.valueOf(this.toDecimal().subtract(other.toDecimal(), AviatorEvaluator.getMathContext())); } } @Override public AviatorObject neg(Map<String, Object> env) { return AviatorDecimal.valueOf(this.toDecimal().negate()); } @Override public AviatorObject innerMult(AviatorNumber other) { switch (other.getAviatorType()) { case Double: return AviatorDouble.valueOf(this.doubleValue() * other.doubleValue()); default: return AviatorDecimal.valueOf(this.toDecimal().multiply(other.toDecimal(), AviatorEvaluator.getMathContext())); } } @Override public AviatorObject innerMod(AviatorNumber other) { switch (other.getAviatorType()) { case Double: return AviatorDouble.valueOf(this.doubleValue() % other.doubleValue()); default: return AviatorDecimal.valueOf(this.toDecimal().remainder(other.toDecimal(), AviatorEvaluator.getMathContext())); } } @Override public AviatorObject innerDiv(AviatorNumber other) { switch (other.getAviatorType()) { case Double: return AviatorDouble.valueOf(this.doubleValue() / other.doubleValue()); default: return AviatorDecimal .valueOf(this.toDecimal().divide(other.toDecimal(), AviatorEvaluator.getMathContext())); } } @Override public AviatorNumber innerAdd(AviatorNumber other) { switch (other.getAviatorType()) { case Double: return AviatorDouble.valueOf(this.doubleValue() + other.doubleValue()); default: return AviatorDecimal.valueOf(this.toDecimal().add(other.toDecimal(), AviatorEvaluator.getMathContext())); } } @Override public int innerCompare(AviatorNumber other) { switch (other.getAviatorType()) { case Double: return Double.compare(this.doubleValue(), other.doubleValue()); default: return this.toDecimal().compareTo(other.toDecimal()); } } @Override public AviatorType getAviatorType() { return AviatorType.Decimal; } }