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);}}
运行结果