package org.marketcetera.core;
import java.math.BigDecimal;
import java.math.MathContext;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;
@ClassVersion("$Id: BigDecimalUtils.java 16154 2012-07-14 16:34:05Z colin $") //$NON-NLS-1$
public class BigDecimalUtils {
// default to read a double primitive value of 18 digit
// precision
public static final NumberFormat DEFAULT_DECIMAL_FORMAT =
new DecimalFormat ("#.0#################",new DecimalFormatSymbols(Locale.US)); //$NON-NLS-1$
public static final MathContext DEFAULT_CONTEXT = new MathContext(4);
public static BigDecimal add (BigDecimal a, BigDecimal b) {
if (a == null) return (b == null) ? BigDecimal.ZERO : b;
return a.add (b);
}
public static BigDecimal subtract (BigDecimal a, BigDecimal b) {
if (a == null) return (b == null) ? BigDecimal.ZERO : b;
return a.subtract (b);
}
public static BigDecimal multiply (double a, double b) {
String s = DEFAULT_DECIMAL_FORMAT.format(a);
BigDecimal bd = new BigDecimal (s); //non-i18n
return multiply (bd, b);
}
public static BigDecimal multiply (BigDecimal a, double b) {
String s = DEFAULT_DECIMAL_FORMAT.format(b);
BigDecimal bd = new BigDecimal (s); //non-i18n
return multiply (a, bd);
}
public static BigDecimal multiply (BigDecimal a, BigDecimal b) {
if (a == null) return (b == null) ? BigDecimal.ZERO : b;
return a.multiply (b);
}
public static BigDecimal divide (BigDecimal a, BigDecimal b) { return divide(a, b, MathContext.DECIMAL128); }
public static BigDecimal divide (BigDecimal a, BigDecimal b, MathContext context) {
if (a == null) return (b == null) ? BigDecimal.ZERO : b;
return a.divide (b, context);
}
/** Returns the BigDecimal value n with trailing zeroes removed. */
public static BigDecimal trim(BigDecimal n) {
try {
int scale;
while((scale = n.scale()) > 0) {
n = n.setScale(scale - 1);
}
} catch (ArithmeticException e) {
// no more trailing zeroes so exit.
}
return n;
}
}