package cn.com.countrygarden.bi.main.util;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberUtil {


    public static String decimalFormat(float decimal) {
        DecimalFormat decimalFormat = new DecimalFormat("######0.00");
        return decimalFormat.format(decimal);
    }

    public static String simpleFormat(Object number) {
        DecimalFormat format = new DecimalFormat("#.##");
        return format.format(number);
    }

    public static Float percentage(float numerator, float fraction) {
        if (fraction == 0) {
            return 0f;
        }
        return numerator / fraction * 100;
    }

    public static Float percentage(int numerator, int fraction) {
        if (fraction == 0) {
            return 0f;
        }
        return (float) numerator / (float) fraction * 100;
    }

    public static Double percentage(Long numerator, Long fraction) {
        if (numerator == null || fraction == null) {
            return 0.0d;
        }
        if (fraction == 0) {
            return 0.0d;
        }
        BigDecimal numeratorDc = new BigDecimal(numerator);
        numeratorDc = numeratorDc.divide(new BigDecimal(fraction), 3, BigDecimal.ROUND_HALF_UP);
        numeratorDc = numeratorDc.multiply(new BigDecimal(100));
        return numeratorDc.setScale(1).doubleValue();
    }

    public static Double avgPercentage(Double totalPercentage, int total) {
        if (totalPercentage == null) {
            return null;
        }

        if (totalPercentage == 0) {
            return 0.0d;
        }
        if (total == 0) {
            return 0.0d;
        }
        BigDecimal percentage = new BigDecimal(Double.toString(totalPercentage));
        percentage = percentage.divide(new BigDecimal(total), 1, BigDecimal.ROUND_HALF_UP);
        return percentage.setScale(1).doubleValue();
    }

    public static BigDecimal toTenOfThousand(BigDecimal data) {
        if (data == null) {
            return null;
        }
        BigDecimal newDate = data.divide(new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP);
        return newDate;
    }

    public static BigDecimal fromTenOfThousand(BigDecimal data) {
        if (data == null) {
            return null;
        }
        BigDecimal newDate = new BigDecimal(data.toPlainString());
        newDate.setScale(2, BigDecimal.ROUND_HALF_UP);
        newDate = newDate.multiply(new BigDecimal(10000));
        return newDate;
    }

    /**
     * 计算两个数的商,结果四舍五入
     *
     * @param dividend 被除数
     * @param divisor  除数
     * @param scale    精度
     * @return 商
     * @Author Geoffrey
     */
    public static String divide(String dividend, String divisor, int scale) {
        if (dividend == null || divisor == null)
            return "0";
        return divide(new BigDecimal(dividend), new BigDecimal(divisor), scale).toPlainString();
    }

    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor, int scale) {
        if (dividend == null || divisor == null) {
            return new BigDecimal(0);
        }
        if (scale <= 0) {
            scale = 2;
        }

        if ((dividend.compareTo(BigDecimal.ZERO) == 0) || (divisor.compareTo(BigDecimal.ZERO) == 0)) {
            return new BigDecimal(0);
        }
        return dividend.divide(divisor, scale, BigDecimal.ROUND_HALF_UP);

    }

    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("-?[0-9]+.?[0-9]+");
        return pattern.matcher(str).matches();
    }

    public static String add(String... args) {
        BigDecimal result = new BigDecimal(BigInteger.ZERO);
        for (String arg : args) {
            if (arg == null) {
                continue;
            }
            if (isNumeric(arg)) {
                result = result.add(new BigDecimal(arg));
            }
        }
        return result.toPlainString();
    }


    /**
     * 运营商号段如下：
     * 中国联通号码：130、131、132、145（无线上网卡）、155、156、185（iPhone5上市后开放）、186、176（4G号段）、
     *               175（2015年9月10日正式启用，暂只对北京、上海和广东投放办理）
     * 中国移动号码：134、135、136、137、138、139、147（无线上网卡）、150、151、152、157、158、159、182、183、187、188、178
     * 中国电信号码：133、153、180、181、189、177、173、149 虚拟运营商：170、1718、1719
     * 手机号前3位的数字包括：
     * 1 :1
     * 2 :3,4,5,7,8
     * 3 :0,1,2,3,4,5,6,7,8,9
     * 总结： 目前java手机号码正则表达式有：
     * a :"^1[3|4|5|7|8][0-9]\\d{4,8}$"    一般验证情况下这个就可以了
     * b :"^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"
     * Pattern和Matcher详解（字符串匹配和字节码）http://blog.csdn.net/u010700335/article/details/44616451
     */
    public static boolean isPhone(String phone){
        String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(phone);
        boolean isMatch = m.matches();
        return isMatch;
    }

    /**
     * 校验手机号
     *
     * @param phone 手机号
     * @return boolean true:是  false:否
     */
    public static boolean isMobile(String phone) {
        String REGEX_MOBILE = "((\\+86|0086)?\\s*)((134[0-8]\\d{7})|(((13([0-3]|[5-9]))|(14[5-9])|15([0-3]|[5-9])|(16(2|[5-7]))|17([0-3]|[5-8])|18[0-9]|19(1|[8-9]))\\d{8})|(14(0|1|4)0\\d{7})|(1740([0-5]|[6-9]|[10-12])\\d{7}))";
        if (StringUtils.isEmpty(phone)) {
            return false;
        }
        return Pattern.matches(REGEX_MOBILE, phone);
    }


    public static void main(String[] args) {

        String a = "100.00000001";
        String b = "100";
        String minus = "-";

        System.out.println(isNumeric(a));
        System.out.println(isNumeric(b));
        System.out.println(add(a, b+minus));
    }
}