单位转换工具类

news2024/11/25 18:31:18

单位转换工具类

    • 1. 工具类转换
      • - 定义装换枚举转换类型
      • - 创建转换工具类,
        • 1. 通过反射去除字段,
        • 2.对照传入map标记的字段需要转换的类型转换
        • 3. 重新赋值
    • 2. 注解转换
      • - 定义注解
      • - 解析注解

1. 工具类转换

- 定义装换枚举转换类型

public enum UnitConvertType {
    /**
     * 精确度
     */
    ACCURACY,
    /**
     * 万元
     */
    TEN_THOUSAND_YUAN,
    /**
     * 百分比
     */
    PERCENTAGE,
    /**
     * 千分比
     */
    PERMIL;

}

- 创建转换工具类,

1. 通过反射去除字段,
2.对照传入map标记的字段需要转换的类型转换
3. 重新赋值
@Slf4j
public class UnitConvertUtil {

    public static <T> void unitMapConvert(List<T> list, Map<String, UnitConvertType> propertyMap){
        list.forEach(item -> {
            //获取所有属性
            Field[] fields = item.getClass().getDeclaredFields();
            for (Field field : fields) {
                if(propertyMap.containsKey(field.getName())){
                    try {
                        //设置属性可访问
                        field.setAccessible(true);
                        //获取属性值
                        Object value = field.get(item);
                        UnitConvertType unitConvertType = propertyMap.get(field.getName());
                        if(value != null){
                            BigDecimal bigDecimal;
                            if(unitConvertType == UnitConvertType.PERCENTAGE){
                                bigDecimal = ((BigDecimal) value).multiply(BigDecimal.valueOf(100));
                                field.set(item,bigDecimal);
                            }else if(unitConvertType == UnitConvertType.PERMIL){
                                bigDecimal = ((BigDecimal) value).multiply(BigDecimal.valueOf(1000));
                                field.set(item,bigDecimal);
                            }else if(unitConvertType == UnitConvertType.TEN_THOUSAND_YUAN){
                                bigDecimal = ((BigDecimal) value).divide(BigDecimal.valueOf(10000)).setScale(2, RoundingMode.HALF_UP);
                                field.set(item,bigDecimal);
                            }else if(unitConvertType == UnitConvertType.ACCURACY){
                                bigDecimal = ((BigDecimal) value).setScale(2, RoundingMode.HALF_UP);
                                field.set(item,bigDecimal);
                            }else{
                                log.error("未知的单位转换类型");
                            }
                        }

                    }catch (Exception e){
                        log.error("属性转换失败",e);
                    }
                }
            }
        });
    }

    public static void main(String[] args) {
        SumReport sumReport = new SumReport();
        sumReport.setPayTotalAmount(new BigDecimal(2390000));
        sumReport.setJcAmountPer(BigDecimal.valueOf(0.885));
        sumReport.setJcCountPer(BigDecimal.valueOf(0.2394));
        sumReport.setLength(BigDecimal.valueOf(1700.64003));

        List<SumReport> list = new ArrayList<>();
        list.add(sumReport);

        Map<String, UnitConvertType> map =new HashMap<>();
        map.put("payTotalAmount", UnitConvertType.TEN_THOUSAND_YUAN);
        map.put("jcAmountPer", UnitConvertType.PERCENTAGE);
        map.put("jcCountPer", UnitConvertType.PERMIL);
        map.put("length", UnitConvertType.ACCURACY);
        unitMapConvert(list,map);
        System.out.println(list);

    }
}

在这里插入图片描述

2. 注解转换

- 定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UnitBigDecConvert {

    UnitConvertType name();
}

- 解析注解

public static <T> void unitAnnotationConvert(List<T> list){
        list.forEach(item -> {
            Field[] fields = item.getClass().getDeclaredFields();
            for (Field field : fields) {
                try {
                    //获取注解
                    UnitBigDecConvert annotation = field.getAnnotation(UnitBigDecConvert.class);
                    if(annotation == null){
                        continue;
                    }
                    UnitConvertType name = annotation.name();
                    field.setAccessible(true);
                    Object o = field.get(item);
                    if(o != null){
                        if(name == UnitConvertType.PERCENTAGE){
                            BigDecimal bigDecimal = ((BigDecimal) o).multiply(BigDecimal.valueOf(100));
                            field.set(item,bigDecimal);
                        }else if(name == UnitConvertType.PERMIL){
                            BigDecimal bigDecimal = ((BigDecimal) o).multiply(BigDecimal.valueOf(1000));
                            field.set(item,bigDecimal);
                        }else if(name == UnitConvertType.TEN_THOUSAND_YUAN){
                            BigDecimal bigDecimal = ((BigDecimal) o).divide(BigDecimal.valueOf(10000)).setScale(2, RoundingMode.HALF_UP);
                            field.set(item,bigDecimal);
                        }else if (name == UnitConvertType.ACCURACY){
                            BigDecimal bigDecimal = ((BigDecimal) o).setScale(2, RoundingMode.HALF_UP);
                            field.set(item,bigDecimal);
                        }else {
                            log.error("未知的单位转换类型");
                        }
                    }
                } catch (IllegalAccessException e) {
                    log.error("装换失败",e);
                }
            }
        });
    }
    public static void main(String[] args) {
        SumReport sumReport = new SumReport();
        sumReport.setPayTotalAmount(new BigDecimal(2390000));
        sumReport.setJcAmountPer(BigDecimal.valueOf(0.885));
        sumReport.setJcCountPer(BigDecimal.valueOf(0.2394));
        sumReport.setLength(BigDecimal.valueOf(1700.64003));

        List<SumReport> list = new ArrayList<>();
        list.add(sumReport);
        
        unitAnnotationConvert(list);
        System.out.println(list);

    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1354828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openmediavault(OMV)(30)插件介绍(3)filebrowser文件管理器

简介 filebrowser可以对omv的文件进行图形化管理,而不需要每次都通过命令进行修改。 更新omv系统 此时已经更新到omv 6.9.10-4 filebrowser安装

java基于SSM的校内信息服务发布系统的设计与实现+vue论文

校内信息服务发布系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定校内信息服务发…

Multipath多路径管理基础介绍与安装配置使用

0x00 前言简述 Q:什么是Multipath多路径? 答:Multipath I/O 电脑储存技术&#xff0c;指利用两个以上的路径同时在CPU与储存设备之间传送讯号&#xff0c;以达到侦错与强化效能的目的。 简单的说当服务器到某一存储设备有多条路径时&#xff0c;每条路径都会识别为一个单独的…

阿里云服务器地域怎么选择?哪个地域好?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

uniapp上传图片,上传头像,多张图片上传,图片回显,图片删除,图片预览

效果图&#xff1a; 上代码不废话&#xff1a; <template><view class"familyCreateMemory"><view class"box"><view class"title"><view>文字&#xff1a;</view><textarea :maxlength"-1"/…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Linux查看物理CPU个数、核数、逻辑CPU个数

查看CPU信息&#xff08;型号&#xff09; [rootAAA ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 24 Intel Xeon CPU E5-2630 0 2.30GHz 查看物理CPU个数 [rootAAA ~]# cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l 2 查看每个物理CPU中co…

【Adobe Acrobat DC】弹窗:正在准备文档以供阅读,请稍候

问题描述 Acrobat打开PDF就会有这个弹窗&#xff0c;要所有扫一遍才能看&#xff0c;要等特别久 解决办法1 参考这篇博客评论区里给出的方法 1. 转到“编辑”>“首选项”>“朗读”。 2. 在“屏幕阅读器选项”下面&#xff0c;选择“仅阅读当前可见页面”。 再次打开…

Linux内核源码下载与在线浏览10种方式

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

顶顶通呼叫中心中间件配置指定振铃时间挂断(mod_cti基于FreeSWITCH)

介绍 一般情况默认是振铃60秒挂断&#xff0c;但是如果想振铃10秒就挂断可以根据下方配置方法一步步去配置。 一、通过线路控制振铃时间 打开ccadmin-》点击线路-》点击你需要控制振铃时间的线路-》配置呼叫超时-》点击更新。 二、通过队列外呼控制振铃时间 打开ccadmin-》…

2024了,如何学习OpenCV?

不知道提问这位有没有了解卷积神经网络这个东西&#xff0c;早在二三十年之前就有手写数字识别了&#xff0c;但是这技术也就是2012年开始火爆了的&#xff0c;所以你看到的当下的热门技术很多都是沉寂了几年、十几年甚至几十年的。 当下对传统的cv技术有些冲击&#xff0c;那…

【计算机毕业设计】SSM二手交易网站

项目介绍 该项目分为前后台&#xff0c;前台普通用户角色&#xff0c;后台管理员角色。 管理员主要功能如下&#xff1a; 登陆,商品分类管理,商品管理,商品订单管理,用户管理等功能。 用户角色主要功能如下&#xff1a; 包含以下功能&#xff1a;查看所有商品,用户登陆注册…

DHTMLX Spreadsheet v5.1.1 Crack

DHTMLX Spreadsheet 5.1 具有新主题、简化的数字格式本地化、与框架的实时集成演示等 推出 DHTMLX Spreadsheet v5.1。新版本提供了一组有用的功能&#xff0c;这对开发人员和最终用户都有吸引力。 首先&#xff0c;新的电子表格版本提供了 4 个内置主题&#xff0c;可以根据您…

4.vue学习(21-25)

文章目录 21.天气案例-监视属性引入22.监视属性23.深度监视24 监视的简写25 监视属性对比计算属性 21.天气案例-监视属性引入 效果&#xff1a;点击按钮&#xff0c;切换凉爽为炎热 vscode 开发vue的插件;vue 3 snippets 初步实现方式。计算属性&#xff1a; 案例中的坑&#…

不想root,但想远程控制vivo手机?这个方法不用root也能做到

远程控制vivo手机不用root&#xff01;今天给大家讲讲免Root情况下&#xff0c;笔记本电脑如何远程控制vivo手机。 在电脑和手机都安装AirDroid&#xff0c;这是免Root的关键。 下载AirDroid个人版 | 远程控制安卓手机软件下载下载AirDroid个人版进行文件传输和管理、远程控制安…

Fiddler抓包之【 抓取https请求 】详解教程

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

力扣hot100 二叉搜索树中第k小的元素 分治 中序遍历

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f60b; 分治 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int va…

uni-app 从入门到精通 3天快速掌握 文字版 学习专栏

大家好&#xff0c;我是java1234小锋老师。 近日锋哥又卷了一波课程&#xff0c;uni-app 从入门到精通 3天快速掌握教程&#xff0c;文字版视频版。三天掌握。 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从…

报告解读:中国新一代终端安全市场洞察,2023

报告解读 中国新一代终端安全市场洞察 2023 安全防御的“最前线” 01 混沌的企业安全 以下来自CSO们最关注的安全热点问题&#xff1a; Q1我们如何看待当下泛化的终端安全&#xff0c;混合的IT环境企业面临的安全变化&#xff1f; IDC&#xff1a;伴随着全球数字化转型的快…

竞赛保研 基于机器视觉的手势检测和识别算法

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng…