如何在mendix中将金钱数字转换为中文大写
红猪
2021.08.25 17:58发布于技术 - 业务逻辑
1.05k2
此技术分享来自于杭州幂链科技有限公司,针对通用业务场景在mendix中将金钱数字转换为中文大写的真实案例的最佳实践。

@TOC 48ee0afa45328da05ea1e51efb63638.png

简介

mendix studio pro 是一个能够开发复合场景,具有通用性的软件开发平台。Mendix平台的软件开发基于模型驱动(model driven development)。

Acknowledgement

感谢来自杭州幂链科技有限公司的马军妹、朱丹晖,徐以林对次技术分享做出的贡献,感谢您对mendix的支持以及做出的知识分享。

场景

将交易或仓库管理,等涉及金钱的表单生成打印时,业务需求:要把最终的金钱数 =>中文金钱数。 举例:12=>拾贰 此场景具有通用性,在此分享给大家

操作过程

1. 在mendix中创建java action

image.png

2.在创建的java action中创建 parameters

点击add ,输入变量名称-可自定义举例’Price‘ , 设置变量类型为’Decimal‘ image.png

3. 点击app 选择 Deploy for eclipse 或在 notepad++打开这个 java action(不建议因为没有语法检查)

image.png

4. 逻辑代码实现部分

// BEGIN EXTRA CODE和// END USER CODE 之间是逻辑实现代码。

import com.mendix.systemwideinterfaces.core.IContext;
import com.mendix.webui.CustomJavaAction;
import org.apache.commons.lang3.StringUtils;

public class Java_action extends CustomJavaAction<java.lang.String>
{
	private java.math.BigDecimal Price;

	public Java_action(IContext context, java.math.BigDecimal Price)
	{
		super(context);
		this.Price = Price;
	}

	@java.lang.Override
	public java.lang.String executeAction() throws Exception
	{
		// BEGIN USER CODE
		java.lang.String result=toChinese(this.Price.toString());
		return result;
		// END USER CODE
	}

	/**
	 * Returns a string representation of this action
	 */
	@java.lang.Override
	public java.lang.String toString()
	{
		return "Java_action";
	}

	// BEGIN EXTRA CODE
	//大写数字
	private static final java.lang.String[] NUMBERS= {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	// 整数部分的单位
	private static final java.lang.String[] IUNIT = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"};
	// 小数部分的单位
	private static final java.lang.String[] DUNIT = {"角","分","厘"};
	public java.lang.String toChinese(java.lang.String Price) {
		// 判断输入的金额字符串是否符合要求
		if (StringUtils.isBlank(Price) || !Price.matches("(-)?[\\d]*(.)?[\\d]*")) {
			return "抱歉,请输入数字!";
		}

		if("0".equals(Price) || "0.00".equals(Price) || "0.0".equals(Price)) {
			return "零元";
		}
		// 判断金额数字中是否存在负号"-"
		java.lang.Boolean flag = false;
		if(Price.startsWith("-")){
			// 标志位,标志此金额数字为负数
			flag = true;
			Price = Price.replaceAll("-", "");
		}

		// 去掉金额数字中的逗号","
		Price = Price.replaceAll(",", "");
		java.lang.String integerStr;//整数部分数字
		java.lang.String decimalStr;//小数部分数字

		// 初始化:分离整数部分和小数部分
		if(Price.indexOf(".")>0) {
			integerStr = Price.substring(0,Price.indexOf("."));
			decimalStr = Price.substring(Price.indexOf(".") + 1);
		}else if(Price.indexOf(".")==0) {
			integerStr = "";
			decimalStr = Price.substring(1);
		}else {
			integerStr = Price;
			decimalStr = "";
		}
		// beyond超出计算能力,直接返回
		if(integerStr.length()>IUNIT.length) {
			return "超出计算能力!";
		}

		// 整数部分数字
		java.lang.Integer[] integers = toIntArray(integerStr);
		// 判断整数部分是否存在输入012的情况
		if (integers.length>1 && integers[0] == 0) {
			return "抱歉,输入数字不符合要求!";
		}
		// 设置万单位
		java.lang.Boolean isWan = isWan5(integerStr);
		// 小数部分数字
		java.lang.Integer[] decimals = toIntArray(decimalStr);
		// 返回最终的大写金额
		java.lang.String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);
		if(flag){
			// 如果是负数,加上"负"
			return "负" + result;
		}else{
			return result;
		}
	}
	/**
	 *  将字符串转为int数组
	 * @param number  数字
	 * @return
	 */
	private java.lang.Integer[] toIntArray(java.lang.String number) {
		java.lang.Integer[] array = new java.lang.Integer[number.length()];
		for(java.lang.Integer i = 0;i<number.length();i++) {
			array[i] = Integer.parseInt(number.substring(i,i+1));
		}
		return array;
	}
	/**
	 *  将整数部分转为大写的金额
	 * @param integers 整数部分数字
	 * @param isWan  整数部分是否已经是达到【万】
	 * @return
	 */
	public java.lang.String getChineseInteger(java.lang.Integer[] integers,java.lang.Boolean isWan) {
		StringBuffer chineseInteger = new StringBuffer("");
		java.lang.Integer length = integers.length;
		if (length == 1 && integers[0] == 0) {
			return "";
		}
		for(java.lang.Integer i=0; i<length; i++) {
			java.lang.String key = "";
			if(integers[i] == 0) {
				if((length - i) == 13)//万(亿)
					key = IUNIT[4];
				else if((length - i) == 9) {//亿
					key = IUNIT[8];
				}else if((length - i) == 5 && isWan) {//万
					key = IUNIT[4];
				}else if((length - i) == 1) {//元
					key = IUNIT[0];
				}
				if((length - i)>1 && integers[i+1]!=0) {
					key += NUMBERS[0];
				}
			}
			chineseInteger.append(integers[i]==0?key:(NUMBERS[integers[i]]+IUNIT[length - i -1]));
		}
		return chineseInteger.toString();
	}
	/**
	 *  将小数部分转为大写的金额
	 * @param decimals 小数部分的数字
	 * @return
	 */
	private java.lang.String getChineseDecimal(java.lang.Integer[] decimals) {
		StringBuffer chineseDecimal = new StringBuffer("");
		for(java.lang.Integer i = 0;i<decimals.length;i++) {
			if(i == 3) {
				break;
			}
			chineseDecimal.append(decimals[i]==0?"":(NUMBERS[decimals[i]]+DUNIT[i]));
		}
		return chineseDecimal.toString();
	}
	/**
	 *  判断当前整数部分是否已经是达到【万】
	 * @param integerStr  整数部分数字
	 * @return
	 */
	private java.lang.Boolean isWan5(java.lang.String integerStr) {
		java.lang.Integer length = integerStr.length();
		if(length > 4) {
			java.lang.String subInteger = "";
			if(length > 8) {
				subInteger = integerStr.substring(length- 8,length -4);
			}else {
				subInteger = integerStr.substring(0,length - 4);
			}
			return java.lang.Integer.parseInt(subInteger) > 0;
		}else {
			return false;
		}
	}
	// END EXTRA CODE
}

References

杭州幂链科技有限公司 : 马军妹、朱丹晖,徐以林 2021年8月25日

作者在、收费的阳光、西蒙子大胡子、小晴天、CaiNiao
点赞
收藏
手机查看
举报
2个评论
倒序看帖
仅看楼主
    西蒙子大胡子
    2021.08.27 00:24 发布
    #1
    不错啊,希望能作为可复用模块分享
    红猪
    点赞
    评论
    举报
    红猪
    评论
    西蒙子大胡子
    2021.08.27 10:35 发布
    作者

    嘿嘿

    首赞
    评论
    举报