Mendix嵌入Java代码将金钱转换为中文大写
作者:互联网
目录
简介
Mendix Studio pro 是一个能够开发复合场景,具有通用性的软件开发平台。Mendix平台的软件开发基于模型驱动(model driven development)。
Acknowledgement
感谢来自杭州幂链科技有限公司的马军妹、朱丹晖,徐以林对次技术分享做出的贡献,感谢您对mendix的支持以及做出的知识分享。
场景示例
将交易或仓库管理,等涉及金钱的表单生成打印时,业务需求:要把最终的金钱数 =>中文金钱数。
举例:12=>拾贰
此场景具有通用性,在此分享给大家
操作过程
1. 在mendix中创建java action
2.在创建的java action中创建 parameters
点击add ,输入变量名称-可自定义举例’Price‘ , 设置变量类型为’Decimal‘
3. 点击app 选择 Deploy for eclipse 或在 notepad++打开这个 java action(不建议因为没有语法检查)
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日
更多信息,请访问以下链接:
Mendix官网:低代码应用开发平台 - 快速高效地构建应用 | Mendix
Mendix中国论坛:Mendix开发者论坛-加入Mendix开发者论坛,一起引领创新
Mendix行业解决方案:Low-Code Solution Gallery | Customizable Solutions For Every Industry
Mendix平台指南:Low-Code Application Development Platform Evaluation Guide | Mendix
Mendix动画展示:Application Development Demos – Mendix Low-Code Platform
感谢阅读!
标签:lang,Java,String,Mendix,Price,大写,return,java 来源: https://blog.csdn.net/Mendix/article/details/121338124