package com.classic.car.utils;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import java.math.BigDecimal;
/**
* 文件描述: 高精度数据计算工具类
* 创 建 人: 续写经典
* 创建时间: 2015/11/3 17:26
*/
@SuppressWarnings({"unused", "WeakerAccess"}) public class MoneyUtil {
// 默认除法运算精度
private static final int DEFAULT_SCALE = 2;
private static final int DEFAULT_ROUNDING_MODE = BigDecimal.ROUND_HALF_UP;
private MoneyUtil() { }
private BigDecimal mBigDecimal;
/**
* 对象转BigDecimal
*/
public static BigDecimal objectToBigDecimal(@NonNull Object number) {
BigDecimal value;
if (number instanceof Integer) {
value = new BigDecimal(Integer.toString((Integer)number));
} else if (number instanceof Float) {
value = new BigDecimal(Float.toString((Float)number));
} else if (number instanceof Double) {
value = new BigDecimal(Double.toString((Double)number));
} else if (number instanceof Short) {
value = new BigDecimal(Short.toString((Short)number));
} else if (number instanceof Long) {
value = new BigDecimal(Long.toString((Long)number));
} else if (number instanceof String) {
value = new BigDecimal(number.toString());
} else { //未知的类型
throw new IllegalArgumentException("unknown type!");
}
return value;
}
/**
* 去掉小数点后无效的0
*/
public static String replace(Number number) {
return replace(String.valueOf(number));
}
/**
* 去掉小数点后无效的0
*/
public static String replace(String number) {
if (TextUtils.isEmpty(number)) { return "0"; }
if (number.indexOf(".") > 0) {
number = number.replaceAll("0+?$", ""); //去掉后面无用的零
number = number.replaceAll("[.]$", ""); //如小数点后面全是零则去掉小数点
}
return number;
}
/**
* 去掉小数点后无效的0
*/
public static String replace(String number, int scale) {
if (TextUtils.isEmpty(number)) { return "0"; }
number = newInstance(number).round(scale).create().toString();
if (number.indexOf(".") > 0) {
number = number.replaceAll("0+?$", ""); //去掉后面无用的零
number = number.replaceAll("[.]$", ""); //如小数点后面全是零则去掉小数点
}
return number;
}
/**
* 去掉小数点后无效的0
*/
public static String replace(Number number, int scale) {
return replace(String.valueOf(number), scale);
}
public static MoneyUtil newInstance(@NonNull Object number) {
MoneyUtil moneyUtil = new MoneyUtil();
moneyUtil.mBigDecimal = objectToBigDecimal(number);
return moneyUtil;
}
/**
* 减
*/
public MoneyUtil subtract(@NonNull Object number) {
mBigDecimal = mBigDecimal.subtract(objectToBigDecimal(number));
return this;
}
/**
* 乘
*/
public MoneyUtil multiply(@NonNull Object number) {
mBigDecimal = mBigDecimal.multiply(objectToBigDecimal(number));
return this;
}
/**
* 除
*/
public MoneyUtil divide(@NonNull Object number) {
return divide(number, DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
}
/**
* 除
*
* @param scale 精确到小数点后几位数
*/
public MoneyUtil divide(@NonNull Object number, int scale) {
return divide(number, scale, DEFAULT_ROUNDING_MODE);
}
/**
* 除
*
* @param scale 精确到小数点后几位数
* @param roundingMode 精确模式
* @see BigDecimal
*/
public MoneyUtil divide(@NonNull Object number, int scale, int roundingMode) {
mBigDecimal = mBigDecimal.divide(objectToBigDecimal(number), scale, roundingMode);
return this;
}
/**
* 加
*/
public MoneyUtil add(@NonNull Object number) {
mBigDecimal = mBigDecimal.add(objectToBigDecimal(number));
return this;
}
/**
* 四舍五入
*
* @param scale 精确到小数点后几位数
*/
public MoneyUtil round(int scale) {
return round(scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 四舍五入
*
* @param scale 精确到小数点后几位数
* @param roundingMode 精确模式
* @see BigDecimal
*/
public MoneyUtil round(int scale, int roundingMode) {
if (scale >= 0) {
mBigDecimal = mBigDecimal.divide(new BigDecimal("1"), scale, roundingMode);
}
return this;
}
public BigDecimal create() {
return mBigDecimal;
}
}