单位转换工具类

单位转换工具类

    • 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);

    }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ / day06

1. 利用模板类完成顺序表(两天时间&#xff0c;今天至少写出大致框架) 代码 //implement template in sqlist #include <iostream> #include <cstring>#define MAXSIZE 100using namespace std;template <typename T> class Sqlist {unsigned int len 0;T…

基于EPICS modbus模块的单通道电压监测项目

先介绍在本项目中使用到的硬件&#xff1a; 1&#xff09;开发板&#xff1a;为香橙派Zero2&#xff0c;安装系统如下&#xff1a; Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy 2&#xff09; USB转485模块&…

水面漂浮物监测识别摄像机

水面漂浮物监测识别摄像机是一种用于监测水体表面上漂浮物的高科技设备。它主要通过安装在水域周边的摄像头实时捕捉水面情况&#xff0c;利用图像识别技术自动识别和监测水面漂浮物。这种设备在环境保护、水域清洁和水质监测等方面具有广泛的应用价值。 水面漂浮物包括各类垃圾…

启动gazebo harmonic

ros2 launch ros_gz_sim gz_sim.launch.py gz_version:8 或者在launch文件内&#xff1a; 如果不输入gz_version:8,默认就是6&#xff0c;启动的就是默认版本ign版本 左边那个是8&#xff0c;右边那个是6

大模型笔记 【1】 大模型初探

以下是Andrej Karpathy一小时讲解chatgpt的笔记。 Andrej Karpathy做自动驾驶的人应该比较熟悉&#xff0c;他是李飞飞的学生。在openAI做了一年半的科学家之后&#xff0c;去了特斯拉。在Tesla AI day讲解tesla自动驾驶方案的就是他。 这里我的主要收获是两个 大模型是一个有…

西电期末1018.logistic方程

一.题目 二.分析与思路 根据题目递归即可&#xff0c;用while函数判断是否到达1000项&#xff0c;内部用abs函数&#xff08;绝对值函数&#xff09;判断是否收敛&#xff0c;最后按照结果输出即可。 三.代码实现 #include<bits/stdc.h>//万能头 int main() {double …

ROS学习记录:在ROS中用C++实现激光雷达避障

前言 本文建立在成功获取激光雷达数据的基础上&#xff0c;详细参考 在ROS中用C实现获取激光雷达的数据 一、实现思路 二、在VScode中打开之前编写好的lidar_node.cpp 三、在lidar_node.cpp中写入如下代码 #include <ros/ros.h> #include <std_msgs/String.h> …

【数据库原理】(5)关系数据库的关系数据结构

关系及相关概念 在关系模型中,无论是实体还是实体之间的联系均由关系(二维表)来表示。 1.域&#xff08;Domain&#xff09; 定义&#xff1a;域是一组具有相同数据类型的值的集合。例子&#xff1a;实数集合、整数集合、英文字母集合等。 2.笛卡儿积&#xff08;Cartesian…

职场革命:六款AI助手改写工作效率的故事

引言 在数字化时代&#xff0c;AI助手正快速成为职场的革命者。这些智能助手不仅仅是效率的提升者&#xff0c;它们更是创新的驱动力&#xff0c;重新定义了我们的工作方式。从自动化PPT创建到智能邮件优化&#xff0c;它们的影响深远且多元。本文将深入探讨六款不同领域的AI助…

三、C语言中的分支与循环—if语句 (1)

在这一章节中我们的学习内容如下&#xff0c;咱们一步步来。 分支结构 1. if语句 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a;&& , || , &#xff01; 5. switch语句 循环结构 6. while循环 7. for循环 8. do-while循环 9. break和conti…

基于VS2019的C++动态链接库DLL生成与调用

一、理论知识及实践经验 实验注意事项及部分程序编写规范&#xff08;部分源自ChatGPT-3.5&#xff09;&#xff1a; Ⅰ __declspec(dllexport)和__declspec(dllimport)是用于在C中定义动态链接库&#xff08;DLL&#xff09;的关键字。在编写动态链接库时&#xff0c;__declsp…

.babky勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 网络安全威胁不断进化&#xff0c;其中.babky勒索病毒引起了广泛关注。这篇文章91数据恢复将深入介绍.babky的狡猾特征&#xff0c;以及在遭受其袭击时如何高效地恢复被加密的数据&#xff0c;并提供实用的预防方法。当面对被勒索病毒攻击导致的数据文件加密…

mac环境下安装部署mysql5.7

下载安装包 进入官网下载MySQL5.7的安装包 https://www.mysql.com/downloads/ 安装包下载完成后双击pkg文件进行安装&#xff0c;无脑点下一步即可&#xff0c;注意安装完成后记得保存最后弹出框的密码 进入系统偏好设置&#xff0c;找到mysql&#xff0c;开启mysql服务…

详谈电商网站建设的四大流程!

在21世纪的互联网时代&#xff0c;电商网站的建设是每个企业发展不可缺少的一次机遇。企业商城网站建设成功也许会获得更大的了利润&#xff1b;如果网站建设不成功&#xff0c;那么也会带来一定的损失。所以建设电商网站不是那么一件简单的事情。那么电商网站制作流程是怎样的…

DoIP学习笔记系列:(八)车厂一般关于DoIP的相关测试分析

文章目录 1. 前言2. 基本项测试2.1 协议版本默认值2.2 车辆标识请求报文格式2.3 带EID的车辆标识请求报文格式2.4 带VIN的车辆标识请求报文格式2.5 否定响应码0x002.6 否定响应码0x012.7 否定响应码0x022.8 否定响应码0x042.9 路由激活应答码0x002.10 路由激活应答码0x012.11 路…

突发!博世「裁员」

对于未来几年的汽车行业需求变化&#xff0c;一级零部件供应商正在加快「降本增效」举措&#xff0c;犹如下游客户更加倾向于降本&#xff0c;而不是无休止的提升整车性能&#xff0c;比如&#xff0c;续航里程、智能化。 本周&#xff0c;全球汽车零部件龙头供应商博世宣布&am…

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 最近更新的速度和频率大不如以前&#xff0c;主要原因还是自己有些懈怠了。学习是一个持续努力的过程&#xff0c;一旦中断&#xff0c;再想保持以往的状态可能要…

钡铼分布式IO在玻璃制造中的实时数据采集与监控应用介绍

导读 玻璃行业多年来一直广泛使用 PLC 来帮助管理生产过程所需的精确材料比例&#xff0c;完全依赖其PLC进行数据采集与控制&#xff0c;并且大量依靠人工来操作&#xff0c;所以这些高成本推动了对成本较低的替代方案的需求。 场景描述 某玻璃厂生产的玻璃生产包括配料段、熔…

性能测试之(六):JMeter 元件

元件&#xff08;多个类似功能组件的容器&#xff09; 组件&#xff1a;封装的方法&#xff0c;比如取样器中的发送请求的方法 一、常见的元件 1、取样器&#xff1a;发送请求2、逻辑处理&#xff1a;控制语句执行顺序3、前置处理器&#xff1a;在请求&#xff08;取样器&…

可狱可囚的爬虫系列课程 08:新闻数据爬取实战

前言 本篇文章中我带大家针对前面所学 Requests 和 BeautifulSoup4 进行一个实操检验。 相信大家平时或多或少都有看新闻的习惯&#xff0c;那么我们今天所要爬取的网站便是新闻类型的&#xff1a;中国新闻网&#xff0c;我们先来使用爬虫爬取一些具有明显规则或规律的信息&am…