单位转换工具类

单位转换工具类

    • 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.mzph.cn/news/596157.shtml

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

相关文章

【AI】使用LoFTR进行图像匹配测试Demo

LoFTR图像匹配的源码解析我们在上篇文章中已经写了&#xff0c;对于怎么试用一下&#xff0c;我这边再啰嗦一下。 0.环境搭建 详细的搭建教程请点击链接查看&#xff0c;这里只对需要特殊注意的地方做阐述 1.创建的Python环境采用python3.8的环境&#xff0c;因为文章发布较早…

来自云仓酒庄分享为什么同一种葡萄会使用不同的名称?

如果你只是刚刚走进葡萄酒世界&#xff0c;走在葡萄酒通道上可能会令人生畏&#xff0c;因为有不同的国家、地区和生产商&#xff0c;除此之外还有数千酿酒葡萄品种。更令人困惑的是&#xff0c;有些地方对同一种葡萄使用不同的名称&#xff01;一个著名的例子是西拉和它澳大利…

2下载Spring,第一个Spring程序+Log4j

https://www.yuque.com/dujubin/ltckqu/kipzgd#&#xff0c;注意的是&#xff0c;现在&#xff08;202401&#xff09;SpringFramework从release搬到了snapshot下&#xff0c;在这下面找到6.0.2下载. 下载后解压到文件夹&#xff0c;整个框架包含非常多jar包。 然后就可以在p…

工业物联网中的网络建设是如何实现的?——青创智通工业物联网

在工业物联网的应用中&#xff0c;如何进行网络建设&#xff0c;对于青创智通工业物联网来说&#xff0c;车间内所有装备均可通过与OPC UA网关连接实现数据采集&#xff0c;OPC UA网关实现Modbus协议、DLT645协议、BACnet协议、CJ188协议、三菱协议、西门子协议、Mbus协议。 通…

信号强度功能 界面、逻辑和图标(免费)

信号强度 需求 vue项目&#xff0c;需要实时监控系统信号&#xff0c;要求&#xff1a; 1.共五格信号&#xff1b; 2.信号0-100为满值&#xff0c;信号100-500为四格&#xff0c;信号500-1000为三格&#xff0c;信号1000-5000为两格&#xff0c;信号5000-20000为一格&#x…

Spring Boot 完善订单【五】集成接入支付宝沙箱支付

1.1.什么是沙箱支付 支付宝沙箱支付&#xff08;Alipay Sandbox Payment&#xff09;是支付宝提供的一个模拟支付环境&#xff0c;用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户&#xff0c;而沙箱环境则提…

快速搭建知识付费平台?明理信息科技,为你提供一站式解决方案

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

Time-series forecasting with deep learning: a survey

人们开发了许多深度学习架构来适应不同领域的时间序列数据集的多样性。在本文中&#xff0c;我们调查了一步前进和多水平时间序列预测中使用的常见编码器和解码器设计&#xff0c;描述了如何将时间信息纳入每个模型的预测中。接下来&#xff0c;我们重点介绍混合深度学习模型的…

计算机组成原理-输入输出系统和IO控制方式

文章目录 总览现代计算机的结构常见的IO设备主机如何与IO设备交互IO控制方式简介程序查询方式程序中断方式DMA控制方式通道控制方式 IO系统基本组成小结 总览 现代计算机的结构 常见的IO设备 主机如何与IO设备交互 IO控制方式简介 数据寄存器&#xff1a;存放主机要输出到外设…

输出回文数-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第23讲。 输出回文数&#…

openwrt使用docker部署adguard home

docker创建macvlan&#xff0c;目的使adguard home具备宿主机同网段IP docker network create -d macvlan --subnet192.168.88.0/24 --gateway192.168.88.254 -o parentbr-lan bridge-host&#xff08;虚拟网卡名字)拉取adguard home镜像 docker pull adguard/adguardhome:la…

为何Selenium这么火?

今天给大家带来的主题是自动化测试框架Selenium&#xff0c;话不多说&#xff0c;直接开始&#xff01; 1.什么是 Selenium 自动化测试 Jason Huggins 于 2004 年创建了一个 JavaScript 框架&#xff0c;旨在将其从重复的手动测试中解放出来。 最初命名为 JavaScriptTestRunn…

【数据结构—二叉树的链式结构实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、二叉树的存储结构 二、二叉树链式结构的实现 2.1手动构建一课树 2.2二叉树的遍历 三、二叉树链式结构的实现 3.1前序遍历(递归) 3.2中序遍历(递归) 3.3后序…

第三方软件测试机构可提供哪些服务类型?如何收费?

随着高新技术的快速发展&#xff0c;软件企业将测试工作交由第三方软件测试机构进行已经成为了行业趋势&#xff0c;因为企业自身的大多精力都投入在产品开发上&#xff0c;第三方软件测试机构的存在也就极大的提供了便利。 第三方软件测试机构是区别于软件企业与软件需求方的…

Spark内核解析-节点启动4(六)

1、Master节点启动 Master作为Endpoint的具体实例&#xff0c;下面我们介绍一下Master启动以及OnStart指令后的相关工作 1.1脚本概览 下面是一个举例&#xff1a; /opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/ha…

科研+临床观摩|牙科医生公派美国从事访问学者交流

很多临床医学专业的访问学者希望在访学从事科研的同时&#xff0c;能到医院进行临床观摩。对于这些申请者的要求&#xff0c;我们会尽量满足。本案例中的T医生&#xff0c;口语较弱&#xff0c;担心英语面试&#xff0c;最终我们为其取得了田纳西大学健康科学中心的邀请函&…

记模型训练损失为NAN

前段时间想把我模型的输入由DWT子带改为分块的图像块&#xff0c;一顿魔改后&#xff0c;模型跑着跑着损失就朝着奇怪的方向跑去了&#xff1a;要么突然增大&#xff0c;要么变为NAN。 为什么训练损失会突然变为NAN呢&#xff1f;这个作者将模型训练过程中loss为NAN或INF的原因…

SoapUI参数传递操作详解

SoapUI 传递参数 本文章主要是通过例子&#xff0c;给大家讲解一下 SoapUI 发送请求时&#xff0c;如何带上参数~ 我们可以先了解下&#xff1a;SoapUI简介&#xff1a;了解这个流行的API测试工具 新建工程 首先新建一个工程&#xff0c;然后在里面进行后续的操作。 填写工程…

【python入门】day12:bug及其处理思路

bug的常见类型 粗心 / 没有好习惯 思路不清 lst[{rating:[9.7,2062397],id:1292052,type:[犯罪,剧情],title:肖申克的救赎,actors:[蒂姆罗宾斯,摩根弗里曼]},{rating:[9.6,1528760],id:1291546,type:[剧情,爱情,同性],title:霸王别姬,actors:[张国荣 ,张丰毅 , 巩俐 ,葛优]},{r…

redis重启后数据丢失问题解决(亲测好用)

redis修改密码重启后发现redis中的数据丢失了 解决办法&#xff1a; 首先在redis的安装目录下查找重启之前的dump.rdb文件&#xff0c;发现只有当天的一个dump.rdb文件&#xff0c;确认不是重启备份的文件 然后我就全盘找一下dump.rdb的备份文件&#xff0c;找到前一天的备份…