BigDecimal类型用于面积换算

案例:

BigDecimal numSum=new BigDecimal("0");//建筑总面积是0

BuildInfo buildInfo=new BuildInfo();
buildInfo.setBuildArea(new BigDecimal("12"));//BigDecimal类型 面积为12
buildInfo.setAreaUnit("0004");//面积单位 0004目前代表 平方千米

BigDecimal buildArea = IprmisUtils.convertArea(buildInfo.getBuildArea(), buildInfo.getAreaUnit(), "0001");//自然幢面积和面积单位进行转换 拿到自然幢平方米的真实面积
numSum=numSum.add(buildArea);//相加 0+转换后为平方米的面积

工具类:


public class IprmisUtils {
    /**
     * 返回实体的所有非 null 字段
     */
    public static String[] getNotNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> notEmptyNames = new HashSet<>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue != null){
                notEmptyNames.add(pd.getName());
            }
        }
        String[] result = new String[notEmptyNames.size()];
        return notEmptyNames.toArray(result);
    }

    /**
     * 返回实体的所有 null 字段
     */
    public static String[] getNullPropertyNames(Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
        Set<String> emptyNames = new HashSet<>();
        for (java.beans.PropertyDescriptor pd : pds) {
            Object srcValue = src.getPropertyValue(pd.getName());
            if (srcValue == null){
                emptyNames.add(pd.getName());
            }
        }
        String[] result = new String[emptyNames.size()];
        return emptyNames.toArray(result);
    }

    /**
     * 面积单位转换
     * @param area 面积
     * @param fromUnit 传入面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米(默认"0001"平方米)
     * @param toUnit 输出面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米
     * @return 转换后面积
     */
    public static BigDecimal convertArea(BigDecimal area, String fromUnit, String toUnit) {
        if(area==null){
            return null;
        }
        if (StrUtil.isBlank(fromUnit)){
            fromUnit = "0001";
        }
        if (fromUnit.equals(toUnit)){
            return area;
        }
        // 将所有单位转换为平方米
        double area1 = area.doubleValue();
        double squareMeters;
        switch (fromUnit) {
            //平方千米
            case "0004":
                squareMeters = area1 * 1000000;
                break;
            //公顷
            case "0003":
                squareMeters = area1 * 10000;
                break;
            //亩
            case "0002":
                squareMeters = area1 * 666.667;
                break;
            //case "0001": //平方米
            //平方米
            default:
                squareMeters = area1;
        }

        // 将平方米转换为目标单位
        double convertedArea;
        switch (toUnit) {
            case "0001": //平方米
                convertedArea = squareMeters;
                break;
            case "0004": //平方千米
                convertedArea = squareMeters / 1000000;
                break;
            case "0003": //公顷
                convertedArea = squareMeters / 10000;
                break;
            case "0002": //亩
                convertedArea = squareMeters / 666.667;
                break;
            default:
                throw new BusinessException("输出面积单位错误!");
        }
        return BigDecimal.valueOf(convertedArea);
    }

    /**
     * 金额单位转换
     * @param amount 金额
     * @param fromUnit 传入金额单位 "0001"元、"0002"万元(传入不在限定值或空默认元)
     * @param toUnit  输出金额单位 "0001"元、"0002"万元
     * @return 转换后金额
     */
    public static BigDecimal convertAmount(BigDecimal amount, String fromUnit, String toUnit) {
        if(amount==null){
            return null;
        }
        if (StrUtil.isBlank(fromUnit)){
            fromUnit = "0001";
        }
        if(fromUnit.equals(toUnit)){
            return amount;
        }
        // 先将输入的金额统一转换为元
        double amount1 = amount.doubleValue();
        double yuan;
        // 万元
        if ("0002".equalsIgnoreCase(fromUnit)) {
            yuan = amount1 * 10000;
            //case "0001": // 元
            // 元
        } else {
            yuan = amount1;
        }

        // 根据目标金额单位进行转换
        double convertedAmount;
        switch (toUnit.toLowerCase()) {
            // 元
            case "0001":
                convertedAmount = yuan;
                break;
            // 万元
            case "0002":
                convertedAmount = yuan / 10000;
                break;
            default:
                throw new BusinessException("输出金额单位错误!");
        }

        return BigDecimal.valueOf(convertedAmount);
    }

    /**
     * 格式化日期
     * @param date 需格式化日期
     * @param formatPattern 格式 不指定默认返回【yyyy-MM-dd】格式
     * @return 格式化后日期
     */
    public static String formatDateToString(Date date, String formatPattern) {
        if(date==null){
            return null;
        }
        if(StrUtil.isBlank(formatPattern)){
            formatPattern="yyyy-MM-dd";
        }
        try {
            // 创建SimpleDateFormat对象,并指定日期格式
            SimpleDateFormat sdf = new SimpleDateFormat(formatPattern);
            // 使用format()方法将日期对象格式化为字符串并返回
            return sdf.format(date);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

    /**
     * 对象属性赋值批量操作
     * @param listA 源数据list
     * @param listB 操作源list
     * @param primaryKey 关联主键
     * @param excludedProperties 排除的字段
     * @param <T> 泛型A
     * @param <U> 泛型B
     */
    public static <T, U> void updateListB(List<T> listA, List<U> listB,String primaryKey, String... excludedProperties) {
        for (T t : listA) {
            for (U u : listB) {
                if (ObjectUtil.equals(getFieldValue(t,primaryKey),getFieldValue(u,primaryKey))){
                    BeanUtils.copyProperties(t, u, excludedProperties);
                }
            }
        }
    }

    /**
     * 反射获取泛型的对应字段的值
     * @param obj 泛型对象
     * @param fieldName 属性名称
     * @param <T> 泛型
     * @return 属性值
     */
    public static <T> Object getFieldValue(T obj, String fieldName) {
        Class<?> clazz = obj.getClass();
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值