59.仿简道云公式函数实战-文本函数-RMBCAP

1. RMBCAP函数

RMBCAP 函数可以将金额小写转换为人民币大写金额形式。

2. 函数用法

RMBCAP(数字)

3. 函数示例

如,在财务结算、报销管理、对公付款等场景中,可以利用 RMBCAP 函数将金额转换为大写,避免被篡改产生的负面影响

4. 代码实战

首先我们在function包下创建text包,在text包下创建RmbCapFunction类,代码如下:

package com.ql.util.express.self.combat.function.text;import com.ql.util.express.Operator;
import com.ql.util.express.exception.QLException;
import com.ql.util.express.self.combat.helper.RmbCapConverter;import java.math.BigDecimal;/*** 类描述: RMBCAP函数** @author admin* @version 1.0.0* @date 2023/11/24 15:00*/
public class RmbCapFunction extends Operator {public RmbCapFunction(String name) {this.name = name;}@Overridepublic Object executeInner(Object[] list) throws Exception {String rst = "";if (list.length == 0) {throw new QLException("操作数异常");} else if (list.length != 1) {throw new QLException("操作数个数异常");} else {//数字Object num = list[0];BigDecimal numB = new BigDecimal(num.toString());double numD = numB.doubleValue();rst = RmbCapConverter.convertToRmbCap(numD);}return rst;}
}

在combat文件夹下,创建工具包helper,在helper包中创建RmbCapConverter类

package com.ql.util.express.self.combat.helper;import java.math.BigDecimal;/*** 类描述: RmbCapConverter工具类** @author admin* @version 1.0.0* @date 2023/11/24 15:02*/
public class RmbCapConverter {private static final String[] RMB_UNIT = {"", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿","拾","佰","仟"};private static final String[] RMB_DIGIT = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};public static String convertToRmbCap(double amount) {BigDecimal bd = new BigDecimal(amount);String rmbCap = "";// 判断金额正负if (bd.compareTo(BigDecimal.ZERO) < 0) {rmbCap += "负";bd = bd.abs();  // 取绝对值}String rmbStr = bd.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();int dotPos = rmbStr.indexOf(".");String integerPart = dotPos == -1 ? rmbStr : rmbStr.substring(0, dotPos);String decimalPart = dotPos == -1 ? "" : rmbStr.substring(dotPos + 1);rmbCap += translateIntegerPart(integerPart);rmbCap += translateDecimalPart(decimalPart);return rmbCap;}private static String translateIntegerPart(String integerPart) {// 移除整数部分的前导零integerPart = integerPart.replaceFirst("^0+", "");if (integerPart.equals("")) {return RMB_DIGIT[0];}StringBuilder rmbCap = new StringBuilder();int digitCount = integerPart.length();int unitIndex = digitCount - 1;boolean zeroFlag = false;for (int i = 0; i < digitCount; i++) {int digit = integerPart.charAt(i) - '0';if (digit == 0) {zeroFlag = true;} else {if (zeroFlag) {rmbCap.append(RMB_DIGIT[0]);}zeroFlag = false;rmbCap.append(RMB_DIGIT[digit]).append(RMB_UNIT[unitIndex]);}unitIndex--;}return rmbCap.toString()+"元";}private static String translateDecimalPart(String decimalPart) {if (decimalPart.equals("") || decimalPart.equals("00")) {return "";} else {int digit1 = decimalPart.charAt(0) - '0';int digit2 = decimalPart.charAt(1) - '0';StringBuilder rmbCap = new StringBuilder();if (digit1 != 0) {rmbCap.append(RMB_DIGIT[digit1]).append("角");}if (digit2 != 0) {rmbCap.append(RMB_DIGIT[digit2]).append("分");}return rmbCap.toString();}}
}

把RmbCapFunction类注册到公式函数入口类中,代码如下:

package com.ql.util.express.self.combat.ext;import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressResourceLoader;
import com.ql.util.express.parse.NodeTypeManager;
import com.ql.util.express.self.combat.function.logic.*;
import com.ql.util.express.self.combat.function.math.*;
import com.ql.util.express.self.combat.function.text.*;/*** 类描述: 仿简道云公式函数实战入口类** @author admin* @version 1.0.0* @date 2023/11/21 15:29*/
public class FormulaRunner extends ExpressRunner {public FormulaRunner() {super();}public FormulaRunner(boolean isPrecise, boolean isTrace) {super(isPrecise,isTrace);}public FormulaRunner(boolean isPrecise, boolean isStrace, NodeTypeManager nodeTypeManager) {super(isPrecise,isStrace,nodeTypeManager);}public FormulaRunner(boolean isPrecise, boolean isTrace, IExpressResourceLoader iExpressResourceLoader, NodeTypeManager nodeTypeManager) {super(isPrecise,isTrace,iExpressResourceLoader,nodeTypeManager);}@Overridepublic void addSystemFunctions() {// ExpressRunner 的内部系统函数super.addSystemFunctions();// 扩展公式函数this.customFunction();}/**** 自定义公式函数*/public void customFunction() {// 逻辑公式函数this.addLogicFunction();// 数学公式函数this.addMathFunction();// 文本函数this.addTextFunction();}public void addTextFunction() {// CHAR函数this.addFunction("CHAR",new CharFunction("CHAR"));// CONCATENATE函数this.addFunction("CONCATENATE",new ConcatenateFunction("CONCATENATE"));// EXACT函数this.addFunction("EXACT",new ExactFunction("EXACT"));// IP函数this.addFunction("IP",new IpFunction("IP"));// ISEMPTY函数this.addFunction("ISEMPTY",new IsEmptyFunction("ISEMPTY"));// JOIN函数this.addFunction("JOIN",new JoinFunction("JOIN"));// LEFT函数this.addFunction("LEFT",new LeftFunction("LEFT"));// LEN函数this.addFunction("LEN",new LenFunction("LEN"));// LOWER函数this.addFunction("LOWER",new LowerFunction("LOWER"));// MID函数this.addFunction("MID",new MidFunction("MID"));// REPLACE函数this.addFunction("REPLACE",new ReplaceFunction("REPLACE"));// REPT函数this.addFunction("REPT",new ReptFunction("REPT"));// RIGHT函数this.addFunction("RIGHT",new RightFunction("RIGHT"));// RMBCAP函数this.addFunction("RMBCAP",new RmbCapFunction("RMBCAP"));}public void addLogicFunction() {// AND函数this.addFunction("AND",new AndFunction("AND"));// IF函数this.addFunction("IF",new IfFunction("IF"));// IFS函数this.addFunction("IFS",new IfsFunction("IFS"));// XOR函数this.addFunction("XOR",new XorFunction("XOR"));// TRUE函数this.addFunction("TRUE",new TrueFunction("TRUE"));// FALSE函数this.addFunction("FALSE",new FalseFunction("FALSE"));// NOT函数this.addFunction("NOT",new NotFunction("NOT"));// OR函数this.addFunction("OR",new OrFunction("OR"));}public void addMathFunction() {// ABS函数this.addFunction("ABS",new AbsFunction("ABS"));// AVERAGE函数this.addFunction("AVERAGE",new AvgFunction("AVERAGE"));// CEILING函数this.addFunction("CEILING",new CeilingFunction("CEILING"));// RADIANS函数this.addFunction("RADIANS",new RadiansFunction("RADIANS"));// COS函数this.addFunction("COS",new CosFunction("COS"));// COT函数this.addFunction("COT",new CotFunction("COT"));// COUNT函数this.addFunction("COUNT",new CountFunction("COUNT"));// COUNTIF函数this.addFunction("COUNTIF",new CountIfFunction("COUNTIF"));// FIXED函数this.addFunction("FIXED",new FixedFunction("FIXED"));// FLOOR函数this.addFunction("FLOOR",new FloorFunction("FLOOR"));// INT函数this.addFunction("INT",new IntFunction("INT"));// LARGE函数this.addFunction("LARGE",new LargeFunction("LARGE"));// LOG函数this.addFunction("LOG",new LogFunction("LOG"));// MAX函数this.addFunction("MAX",new MaxFunction("MAX"));// MIN函数this.addFunction("MIN",new MinFunction("MIN"));// MOD函数this.addFunction("MOD",new ModFunction("MOD"));// POWER函数this.addFunction("POWER",new PowerFunction("POWER"));// PRODUCT函数this.addFunction("PRODUCT",new ProductFunction("PRODUCT"));// RAND函数this.addFunction("RAND",new RandFunction("RAND"));// ROUND函数this.addFunction("ROUND",new RoundFunction("ROUND"));// SIN函数this.addFunction("SIN",new SinFunction("SIN"));// SMALL函数this.addFunction("SMALL",new SmallFunction("SMALL"));// SQRT函数this.addFunction("SQRT",new SqrtFunction("SQRT"));// SUM函数this.addFunction("SUM",new SumFunction("SUM"));// SUMIF函数this.addFunction("SUMIF",new SumIfFunction("SUMIF"));// SUMIFS函数this.addFunction("SUMIFS",new SumIfsFunction("SUMIFS"));// SUMPRODUCT函数this.addFunction("SUMPRODUCT",new SumProductFunction("SUMPRODUCT"));// TAN函数this.addFunction("TAN",new TanFunction("TAN"));}
}

创建测试用例

package com.ql.util.express.self.combat;import com.ql.util.express.DefaultContext;
import com.ql.util.express.self.combat.ext.FormulaRunner;
import org.junit.Test;
/*** 类描述: 实战测试类** @author admin* @version 1.0.0* @date 2023/11/21 15:45*/
public class CombatTest {@Testpublic void RMBCAP() throws Exception{FormulaRunner formulaRunner = new FormulaRunner(true,true);// 创建上下文DefaultContext<String, Object> context = new DefaultContext<>();String express = "RMBCAP(1234111111.56)";Object object = formulaRunner.execute(express, context, null, true, true);System.out.println(object);}}

运行结果

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

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

相关文章

Socket网络编程(一)——网络通信入门基本概念

目录 网络通信基本概念什么是网络&#xff1f;网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket&#xff1f;Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试&#xff08;TCP消息发送与接收&#…

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟&#xff1a;RCC_APB2Perip…

前端架构: 脚手架之包管理工具的案例对比及workspaces特性的使用与发布过程

npm的workspaces 特性 1 &#xff09;使用或不使用包管理工具的对比 vue-cli 这个脚手架使用 Lerna 管理&#xff0c;它的项目显得非常清晰在 vue-cli 中包含很多 package 点开进去&#xff0c;每一个包都有package.json它里面有很多项目&#xff0c;再没有 Lerna 之前去维护和…

SpringCloudNacos注册中心服务分级存储模型

文章目录 服务分级存储模型概述配置集群同集群优先的负载均衡 权重配置总结 之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos 的服务分级存储模型做理论与实践. 服务分级存储模型概述 一个服务可以有多个实例&#xff0c;例如我们的 user-server&#xff0c;可以有:…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档&#xff0c;但是没有书签&#xff0c;八百多页的内容查找和跳转都不方便&#xff0c;本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤&#xff1a;1&#xff…

VR全景HDR拍摄教程

什么是HDR&#xff1f; HDR可以用在哪里&#xff1f; 书面解释&#xff1a;HDR&#xff08;高动态范围 High Dynamic Range&#xff09;摄影&#xff0c;是摄影领域广泛使用的一种技术。 是不是有点懵&#xff1f; 我们来看一个实际的拍摄现场环境&#xff0c;你就懂了 我们…

使用 Gradle 版本目录进行依赖管理 - Android

/ 前言 / 在软件开发中&#xff0c;依赖管理是一个至关重要的方面。合理的依赖版本控制有助于确保项目的稳定性、安全性和可维护性。 Gradle版本目录&#xff08;Version Catalogs&#xff09;是 Gradle 构建工具的一个强大功能&#xff0c;它为项目提供了一种集中管理依赖…

定时任务框架

定时任务的框架有哪些 ● Timer&#xff0c;JDK自带的&#xff0c;比较简单&#xff0c;使用的时候&#xff0c;定义一个TimerTask&#xff0c;实现run方法&#xff0c;然后定义一个Timer类&#xff0c;调用timer.schedule(timerTask,1000,3000); ○ 缺点&#xff1a;单线程、…

附加Numpy数组

参考&#xff1a;Append Numpy Array 引言 在数据科学和机器学习领域&#xff0c;处理大规模数据集是一项重要且常见的任务。为了高效地处理数据&#xff0c;numpy是一个非常强大的Python库。本文将详细介绍numpy中的一个重要操作&#xff0c;即如何附加&#xff08;append&a…

LeetCode:2867. 统计树中的合法路径数目(筛质数+ DFS Java)

目录 2867. 统计树中的合法路径数目 题目描述&#xff1a; 实现代码与思路&#xff1a; 筛质数 DFS 原理思路&#xff1a; 2867. 统计树中的合法路径数目 题目描述&#xff1a; 给你一棵 n 个节点的无向树&#xff0c;节点编号为 1 到 n 。给你一个整数 n 和一个长度为 …

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Jquery操作DOM对象

文章目录 目录 文章目录 本章目标 一.DOM操作分类 二.JQuery中的DOM操作 内容操作 属性值操作 节点操作 节点属性操作 节点遍历 总结 本章目标 使用Jquery操作网页元素使用JQuery操作文本与属性值内容使用JQuery操作DOM节点使用Jquery遍历DOM节点使用JQuery操作CSS-DOM 一…

WebServer -- 日志系统(下)

目录 &#x1f33c;整体思路 &#x1f382;基础API fputs 可变参数宏 __VA_ARGS__ fflush &#x1f6a9;流程图与日志类定义 流程图 日志类定义 &#x1f33c;功能实现 生成日志文件 && 判断写入方式 日志分级与分文件 &#x1f33c;整体思路 日志系统分两部…

无法调试MFC源码

VS无法调试MFC源码 起初 有时候就是这么无奈&#xff0c;MFC源码各种问题没有办法调试&#xff0c;可是又想看下代码如何调用&#xff0c;里面做了些什么&#xff0c;从哪儿调出&#xff0c;学习一下大神的思路什么的。整理一下有可能的原因。 检查生成代码设置 需要设置正…

04 Opencv图像操作

文章目录 读写像素修改像素值Vec3b与Vec3F灰度图像增强获取图像通道bitwise_not 算子对图像非操作 读写像素 读一个GRAY像素点的像素值&#xff08;CV_8UC1&#xff09; Scalar intensity img.at(y, x); 或者 Scalar intensity img.at(Point(x, y)); 读一个RGB像素点的像素值…

虚拟机看不到共享文件夹

johnjohn-virtual-machine:/mnt/hgfs$ cat /etc/issue Ubuntu 20.04.6 LTS \n \l 看下是否挂载 johnjohn-virtual-machine:/mnt/hgfs$ vmware-hgfsclient FPGAs_AdaptiveSoCs_Unified_2023.2_1013_2256 xilinx 取消挂载 johnjohn-virtual-machine:/mnt/hgfs$ sudo umount /mn…

kvm虚拟机修改网络模式

kvm修改网络模式可以直接使用virsh命令进行修改 一、查看主机 virsh list --all 二、查看需要修改主机的网络模式 virsh domiflist mysql 三、vim进行修改 cd /etc/libvirt/qemu/ vim mysql.xml 四、找到要修改的网卡部分 五、重新定义虚拟机 virsh define mysql_install.xml…

java工具类之解析地址

输出 代码实现 import java.util.regex.Matcher; import java.util.regex.Pattern;public class AddressResolutionUtil {/*** 解析地址* author ys* param address* return*/public static String addressResolution(String address){String regex"(?<province>…

Java的编程之旅32——继承与多态的联合使用

模拟USB设备接入电脑 1.首先建立一个名为“USB”的抽象类 public abstract class USB {public abstract void On();public abstract void Off(); }这是一个抽象类USB&#xff0c;表示一个USB设备。 该类有两个抽象方法On()和Off()&#xff0c;分别表示打开和关闭USB设备。 由…

javaee教程郑阿奇,一线互联网架构师筑基必备技能之Java篇

一、什么情况下会发生栈内存溢出&#xff1f; 1、栈是线程私有的&#xff0c;栈的生命周期和线程一样&#xff0c;每个方法在执行的时候就会创建一个栈帧&#xff0c;它包含局部变量表、操作数栈、动态链接、方法出口等信息&#xff0c;局部变量表又包括基本数据类型和对象的引…