package thyyxxk.webserver.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * @author dj
 */
public class DecimalUtil {

    public static String add(String a, String b) {
        if (StringUtil.isBlank(a)) {
            a = "0";
        }
        if (StringUtil.isBlank(b)) {
            b = "0";
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        return ad.add(bd).setScale(2, RoundingMode.HALF_UP).toString();
    }

    public static String add(String a, String b, String c) {
        if (StringUtil.isBlank(a)) {
            a = "0";
        }
        if (StringUtil.isBlank(b)) {
            b = "0";
        }
        if (StringUtil.isBlank(c)) {
            c = "0";
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        BigDecimal cd = new BigDecimal(c);
        return ad.add(bd).add(cd).setScale(2, RoundingMode.HALF_UP).toString();
    }

    public static String add1(String a, String b) {
        if (StringUtil.isBlank(a)) {
            a = "0";
        }
        if (StringUtil.isBlank(b)) {
            b = "0";
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        return ad.add(bd).setScale(0, RoundingMode.HALF_UP).toString();
    }

    public static String minus(String a, String b) {
        if (StringUtil.isBlank(a)) {
            a = "0";
        }
        if (StringUtil.isBlank(b)) {
            b = "0";
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        return ad.subtract(bd).setScale(2, RoundingMode.HALF_UP).toString();
    }

    public static Double minusDouble(Double a, Double b) {
        if (null == a) {
            a = 0d;
        }
        if (null == b) {
            b = 0d;
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        return ad.subtract(bd).setScale(2, RoundingMode.HALF_UP).doubleValue();
    }

    public static BigDecimal divide(BigDecimal a, BigDecimal b) {
        return a.divide(b, 0, RoundingMode.HALF_UP);
    }

    public static BigDecimal divide(BigDecimal a, BigDecimal b, int scale) {
        if (b.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        return a.divide(b, scale, RoundingMode.HALF_UP);
    }

    public static String percentage(String a, String b) {
        if (compare(a, "0") == 0) {
            return "0.00%";
        }
        if (compare(b, "0") == 0) {
            return "无法计算";
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        BigDecimal adb = ad.divide(bd, 4, RoundingMode.CEILING);
        return adb.multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%";
    }

    public static String minusLink(String a, String b, String c, String d) {
        if (StringUtil.isBlank(a)) {
            a = "0";
        }
        if (StringUtil.isBlank(b)) {
            b = "0";
        }
        if (StringUtil.isBlank(c)) {
            c = "0";
        }
        if (StringUtil.isBlank(d)) {
            d = "0";
        }
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        BigDecimal cd = new BigDecimal(c);
        BigDecimal dd = new BigDecimal(d);
        return ad.subtract(bd).subtract(cd).subtract(dd).setScale(2, RoundingMode.HALF_UP).toString();
    }

    public static BigDecimal add(BigDecimal a, BigDecimal b) {
        if (null == a) {
            a = BigDecimal.ZERO;
        }
        if (null == b) {
            b = BigDecimal.ZERO;
        }
        return a.add(b).setScale(2, RoundingMode.HALF_UP);
    }

    public static BigDecimal minus(BigDecimal a, BigDecimal b) {
        if (null == a) {
            a = BigDecimal.ZERO;
        }
        if (null == b) {
            b = BigDecimal.ZERO;
        }
        return a.subtract(b).setScale(2, RoundingMode.HALF_UP);
    }

    public static String divide(String a, String b, int scale) {
        BigDecimal ad = new BigDecimal(a);
        BigDecimal bd = new BigDecimal(b);
        return ad.divide(bd, scale, RoundingMode.DOWN).toString();
    }

    public static String moneyYuanToFen(BigDecimal fee) {
        BigDecimal hundred = new BigDecimal("100");
        return fee.multiply(hundred).setScale(0, RoundingMode.CEILING).toPlainString();
    }

    public static String getPercent(int x, int total) {
        double v = (double) x / (double) total;
        DecimalFormat df = new DecimalFormat("0.00%");
        return df.format(v);
    }

    public static String getPercent(double x, double total) {
        if (x == 0 && total == 0) {
            return "0.00%";
        }
        String result;
        double v = x / total;
        DecimalFormat df = new DecimalFormat("0.00%");
        result = df.format(v);
        return result;
    }

    public static int compare(String a, String b) {
        if (StringUtil.isBlank(a)) {
            a = "0";
        }
        if (StringUtil.isBlank(b)) {
            b = "0";
        }
        BigDecimal d1 = new BigDecimal(a);
        BigDecimal d2 = new BigDecimal(b);
        return d1.compareTo(d2);
    }

    public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
        if (null == a) {
            a = BigDecimal.ZERO;
        }
        if (null == b) {
            b = BigDecimal.ZERO;
        }
        return a.multiply(b).setScale(2, RoundingMode.HALF_UP);
    }

    public static boolean biggerThanZero(String num) {
        if (!StringUtil.validValue(num)) {
            return false;
        }
        try {
            return new BigDecimal(num).compareTo(BigDecimal.ZERO) > 0;
        } catch (Exception e) {
            return false;
        }

    }

}
