单位转换工具类

单位转换工具类

    • 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.rhkb.cn/news/230282.html

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

相关文章

break,continue跳出指定循环小案例

某一天&#xff0c;你犯了一个错误&#xff0c;你老婆罚你做5天家务&#xff0c;每天去洗碗&#xff0c;洗碗到第三天心软了&#xff0c;原谅你了只有第三太不用洗碗 public class BreakDemo {public static void main(String[] args) {//某一天&#xff0c;你犯了一个错误&am…

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台&#xff0c;是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入&#xff0c;通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据&#xff0c;支持无插件H5直播…

现在的人们如何看待数据隐私?

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 在当前时代&#xff0c;每一次点击、触摸或按键都留下了数字痕迹。但是我们对自己的个人数据几乎没有控制的权限&#xff0c;这让…

主流桌面浏览器Chrome,FireFox和Edge等如何禁用弹出式窗口阻止程序,这里有详细步骤

为什么你想知道如何禁用浏览器中的弹出式窗口阻止程序?毕竟,弹出式窗口是网络的祸害:显示烦人的广告、虚假的安全消息和其他刺激,会分散你的浏览注意力,甚至可能包含恶意代码。 所有主要的桌面浏览器现在都默认阻止弹出式窗口,那么你到底为什么要取消阻止这些害虫呢?事…

c++的三大特性之关于继承

目录 继承的概念及定义 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元&#xff0c;静态成员 继承的概念及定义 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类…

gitee创建仓库

描述 本文章记录了怎么在gitee上创建项目&#xff0c;以及使用vscode提代码到远程呢个仓库&#xff0c;如何创建一个新分支&#xff0c;并将新分支提交到远程仓库。 1、创建远程仓库 在创建远程仓库之前要先进行ssh密钥的设置 &#xff08;1&#xff09;打开黑窗口&#xff…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发&#xff0c;未设置地址转换的情况 2. 开启路由转发&#xff0c;并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 &#xff08;1&#xff09;打开网关的路由转发 &#xff08;2&#xff09;…

[C#]C# OpenVINO部署yolov8目标检测模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 抛弃了前几代模型的 Anchor-Base。 YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来&#xff0c;领域内的研究者们…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、​​​​​​​使用示例

静态网页设计——个人简介网站

前言 使用经典前端三件套HTMLCSSJavascript编写了一个关于个人简介的静态网页&#xff0c;可以根据自己的需要&#xff0c;十分简单的进行修改。 首页 首页由上方的菜单栏以及菜单栏下面的轮播图组成&#xff0c;再往下走&#xff0c;是关于自己的兴趣爱好的部分&#xff0c…

django学习:页面渲染与请求和响应

1.请求过程 2.页面渲染 在app中新建一个目录&#xff08;Directory&#xff09;&#xff0c;文件名命名为templates。该文件名命名是固定的&#xff0c;不可命名出错&#xff0c;如若后续步骤出错&#xff0c;该目录文件名是一个检查的重点项目。在该目录下新建一个html文件&a…

深度学习:大规模模型分布式训练框架DeepSpeed

深度学习&#xff1a;大规模模型分布式训练框架DeepSpeed DeepSpeed简介DeepSpeed核心特点DeepSpeed如何工作&#xff1f;DeepSpeed如何使用&#xff1f;参考文献 DeepSpeed简介 随着机器学习模型变得越来越复杂和庞大&#xff0c;训练这些模型所需的计算资源也在不断增加。特别…

如何查找iPhone中所有的应用程序

​ ​ Apple 的 App Store 共有约 200 万个适用于 iPhone 和 iPad 的应用程序。如果您像我们一样&#xff0c;您的 iOS 或 iPadOS 设备上可能有数十个应用程序&#xff0c;但没有机会将它们全部整理好。您很容易忘记主屏幕上应用程序图标的位置。 幸运的是&#xff0c;iPhone…

向日葵远程工具的使用Mysql5.7的安装与配置

目录 一、向日葵远程安装与使用 二、Mysql 5.7 安装与配置 2.1 安装 2.2 Navicat Premium 12 测试连接 本机测试连接 外部访问MySQL测试连接 三、思维导图 一、向日葵远程安装与使用 简介&#xff1a; 向日葵远程控制是一款用于对远程PC进行管理和服务的软件,拥有5秒快速…

智能型参数可设置比例阀放大器

智能型参数可设置比例阀放大器是一种电液控制技术&#xff0c;它可以驱动不带电气位移反馈的各种比例溢流阀、比例流量阀、比例减压阀、比例方向阀和比例插装阀等。 这种放大器的特点是可以将输入的模拟量指令信号进行处理运算&#xff0c;通过比例电磁铁将驱动电流线性转换为作…

网页爬虫对于网络安全有哪些影响?

在当今信息爆炸的时代&#xff0c;网络已经成为人们获取信息、交流思想和开展业务的重要平台。然而&#xff0c;随着网络的普及和技术的不断发展&#xff0c;网络安全问题也日益凸显&#xff0c;其中网页爬虫对网络安全的影响不容忽视。本文将就网页爬虫对网络安全的影响进行深…

PyQt 多线程多进程研究

杰哥&#xff0c;PyQT系统界面卡顿的问题是因为检测图片的耗时太长了&#xff0c;大概一张图片四十多秒。如果用多线程来解决耗时几秒的任务&#xff0c;是可以在之前卡顿问题上进一步解决的。但是不能解决像我们这种超长耗时的任务的&#xff0c;只能利用多线程来避免。我尝试…

Transformer从菜鸟到新手(二)

引言 这是Transformer的第二篇文章&#xff0c;上篇文章中我们了解了分词算法BPE&#xff0c;本文我们继续了解Transformer中的位置编码和核心模块——多头注意力。 位置编码 我们首先根据BPE算法得到文本切分后的子词标记&#xff0c;然后经过输入嵌入层将每个标记转换为对…

FreeRTOS——互斥信号量知识总结及其实战

1互斥信号量的概念 1&#xff09;互斥信号量&#xff1a;是一个拥有优先级继承的二值信号量&#xff0c;在同步的应用中二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中&#xff01; 2&#xff09;优先级继承&#xff1a;当一个互斥信号量正在被一个低优先级的…

DIY 云成本优化的5大挑战

外星人。 黑暗骑士。 帝国反击战。 在 Incredibuild&#xff0c;如果有一样东西我们喜欢&#xff0c;那就是我们的话题永远有续集。我们将针对云端优化推出一个更深入的续集&#xff0c; 但这一次我们谈论的是云成本优化&#xff0c;采用 DIY 的方式。&#xff08;如果你还不…