单位转换工具类

单位转换工具类

    • 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;因为文章发布较早…

性价比window+Linux二合一主机

一边学习,一边总结,一边分享! 写在前面 我在2023年12月组了一台“洋垃圾”的主机,一边当做台式机使用,一边当做服务器使用。这个方案算是相对比较划算的方案。我开始是打算直接单做服务器使用的,以及内存配的很高,但是后面和同事一起商量后,还是接受了后面的方案。大…

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

如果你只是刚刚走进葡萄酒世界&#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;我们重点介绍混合深度学习模型的…

Kubernets(K8S)启动和运行 01-02 Kubernetes的速度非常快

Kubernetes的速度非常快 简介&#xff08;Intoduction&#xff09; Velocity is the key component in nearly all software development today. The software industry has evolved from shipping products as boxed CDs or DVDs to software that is delivered over the ne…

计算机组成原理-输入输出系统和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…

【数据采集】Python爬虫「序」

Python网络爬虫简介 爬取方式 Xpath Selenium库 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safa…

为何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后序…

2023年广东省网络安全B模块(笔记详解)

模块B 网络安全事件响应、数字取证调查和应用安全 一、项目和任务描述: 假定你是某网络安全技术支持团队成员,某企业的服务器系统被黑客攻击,你的团队前来帮助企业进行调查并追踪本次网络攻击的源头,分析黑客的攻击方式,发现系统漏洞,提交网络安全事件响应报告,修复系统…

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

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

fetch 流式请求

async function getStream() {try {let response await fetch(/chat/stream/你好&#xff1f;); // /chat/stream/后面跟问题if (!response.ok) {throw new Error(Network response was not ok);}const reader response.body.getReader();const textDecoder new TextDecode…

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…