package com.bocloud.ims.entity.common;

import java.math.BigDecimal;

/**
 * 数学运算工具类
 *
 * @author sxp
 * @since Apr 16, 2018
 */
public class MathUtils {
    /**
     * 四舍五入函数
     *
     * @param sourceNum 原来的数字
     * @param scale     需要保留的精度，即小数点后的位数
     * @author sxp
     * @since 2018-04-26
     */
    public static double round(double sourceNum, int scale) {
        BigDecimal sourceBD = new BigDecimal(Double.toString(sourceNum));
        BigDecimal one = new BigDecimal("1");

        // ROUND_HALF_UP
        // 向“最接近的”数字舍入，如果与两个相邻数字的距离相等，则舍入远离零的方向（数轴上方向上）。
        // 注意，这是我们大多数人在小学时就学过的舍入模式，即四舍五入。

        return sourceBD.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 判定一个字符串是不是数值
     *
     * @author Shawpin Shi
     * @since Jun 30, 2016
     */
    public static boolean isNumber(String numberString) {
        try {
            Double.parseDouble(numberString);
            return true;
        } catch (NumberFormatException ex) {
            return false;
        }
    }


    /**
     * 判定一个字符串是不是长整型
     *
     * @author sxp
     * @since V1.0 2017-4-26
     */
    public static boolean isLong(String numberString) {
        try {
            Long.parseLong(numberString);
            return true;
        } catch (NumberFormatException ex) {
            return false;
        }
    }

    /**
     * 将数字或字符串转换为整数
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static int castToInt(Object value) {
        if (value == null) {
            return 0;
        }

        if (value instanceof Integer) {
            return ((Integer) value).intValue();
        }

        if (value instanceof Number) {
            return ((Number) value).intValue();
        }

        if (value instanceof String) {
            String strVal = (String) value;

            if (strVal.length() == 0 //
                    || "null".equals(strVal) //
                    || "NULL".equals(strVal)) {
                return 0;
            }

            if (strVal.indexOf(',') != 0) {
                strVal = strVal.replaceAll(",", "");
            }

            return Integer.parseInt(strVal);
        }

        if (value instanceof Boolean) {
            return ((Boolean) value).booleanValue() ? 1 : 0;
        }

        throw new RuntimeException("can not cast to int, value : " + value);
    }

    /**
     * 将数字或字符串转换为长整数
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static long castToLong(Object value) {
        if (value == null) {
            return 0;
        }

        if (value instanceof Number) {
            return ((Number) value).longValue();
        }

        if (value instanceof String) {
            String strVal = (String) value;
            if (strVal.length() == 0 //
                    || "null".equals(strVal) //
                    || "NULL".equals(strVal)) {
                return 0;
            }

            if (strVal.indexOf(',') != 0) {
                strVal = strVal.replaceAll(",", "");
            }

            try {
                return Long.parseLong(strVal);
            } catch (NumberFormatException ex) {
                //
            }
        }

        throw new RuntimeException("can not cast to long, value : " + value);
    }

    /**
     * 将数字或字符串转换为Double
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static double castToDouble(Object value) {
        if (value == null) {
            return 0;
        }

        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }

        if (value instanceof String) {
            String strVal = value.toString();
            if (strVal.length() == 0 //
                    || "null".equals(strVal) //
                    || "NULL".equals(strVal)) {
                return 0;
            }

            if (strVal.indexOf(',') != 0) {
                strVal = strVal.replaceAll(",", "");
            }

            return Double.parseDouble(strVal);
        }

        throw new RuntimeException("can not cast to double, value : " + value);
    }

    /**
     * 将数字或字符串转换为整数
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static Integer castToIntClass(Object value) {
        if (value == null) {
            return null;
        }

        if (value instanceof Integer) {
            return ((Integer) value).intValue();
        }

        if (value instanceof Number) {
            return ((Number) value).intValue();
        }

        if (value instanceof String) {
            String strVal = (String) value;

            if (strVal.length() == 0 //
                    || "null".equals(strVal) //
                    || "NULL".equals(strVal)) {
                return null;
            }

            if (strVal.indexOf(',') != 0) {
                strVal = strVal.replaceAll(",", "");
            }

            return Integer.parseInt(strVal);
        }

        if (value instanceof Boolean) {
            return ((Boolean) value).booleanValue() ? 1 : 0;
        }

        throw new RuntimeException("can not cast to int, value : " + value);
    }

    /**
     * 将数字或字符串转换为长整数
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static Long castToLongClass(Object value) {
        if (value == null) {
            return null;
        }

        if (value instanceof Number) {
            return ((Number) value).longValue();
        }

        if (value instanceof String) {
            String strVal = (String) value;
            if (strVal.length() == 0 //
                    || "null".equals(strVal) //
                    || "NULL".equals(strVal)) {
                return null;
            }

            if (strVal.indexOf(',') != 0) {
                strVal = strVal.replaceAll(",", "");
            }

            try {
                return Long.parseLong(strVal);
            } catch (NumberFormatException ex) {
                //
            }
        }

        throw new RuntimeException("can not cast to long, value : " + value);
    }

    /**
     * 将数字或字符串转换为Double
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static Double castToDoubleClass(Object value) {
        if (value == null) {
            return null;
        }

        if (value instanceof Number) {
            return ((Number) value).doubleValue();
        }

        if (value instanceof String) {
            String strVal = value.toString();
            if (strVal.length() == 0 //
                    || "null".equals(strVal) //
                    || "NULL".equals(strVal)) {
                return null;
            }

            if (strVal.indexOf(',') != 0) {
                strVal = strVal.replaceAll(",", "");
            }

            return Double.parseDouble(strVal);
        }

        throw new RuntimeException("can not cast to double, value : " + value);
    }

    // 不确定的对象和一个string类型进行比较
    public static int compareString(Object valueA, String valueB) {
        if (null == valueA || null == valueB) {
            return 0;
        }
        if (valueA instanceof Integer) {
            return ((Integer) valueA).compareTo(Integer.parseInt(valueB));
        }
        if (valueA instanceof Long) {
            return ((Long) valueA).compareTo(Long.parseLong(valueB));
        }
        if (valueA instanceof Double) {
            return ((Double) valueA).compareTo(Double.parseDouble(valueB));
        }
        if (valueA instanceof String) {
            // 如果valueB中包含valueA，且不区分大小写，我们就认为这二个字段是相等的
            return ((String) valueA).compareToIgnoreCase(valueB);
        }
        return 0;
    }

    /**
     * 将数字或字符串转换为整数，转换过程中如果出现异常则返回0
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static int castToIntNoException(Object value) {
        try {
            return castToInt(value);
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * 将数字或字符串转换为长整数，转换过程中如果出现异常则返回0
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static long castToLongNoException(Object value) {
        try {
            return castToLong(value);
        } catch (Exception e) {
            return 0L;
        }
    }

    /**
     * 将数字或字符串转换为Double，转换过程中如果出现异常则返回0
     *
     * @author sxp
     * @since 2018/5/25
     */
    public static double castToDoubleNoException(Object value) {
        try {
            return castToDouble(value);
        } catch (Exception e) {
            return 0D;
        }
    }

    public static String addZeroForNum(String str, int strLength) {
        int strLen = str.length();
        if (strLen < strLength) {
            while (strLen < strLength) {
                str = "0" + str;// 左补0
                strLen = str.length();
            }
        }
        return str;
    }
}
