金额数字转换(小写转大写)

本文介绍了一种将人民币金额从小写转换为大写的Java方法实现。通过定义数字和货币单位的映射,该方法能够处理包含小数点的金额,并确保输入的合法性。文章详细解释了代码逻辑,包括数字验证、位数限制和特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

人民币金额,小写转大写。代码如下:

public String convert(String money) {
	String[] numberCNN = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	String[] subMonetCN = {"","拾","佰","仟"};
	
	String formatCN = "";
	int point = money.indexOf(".");
	if(point!=-1) {
		String money1 = money.substring(0, point);		//小数点前的整数部分
		String money1_1 = (new StringBuffer(money1).reverse()).toString(); //反转
		String money2 = money.substring(point+1);		//小数点后的小数部分
		
		//判断小数点前后是不是数字
		if(!StringUtils.isNumeric(money1)||!StringUtils.isNumeric(money2)) {
			formatCN = "输入内容必须是数字,请重新输入";
			System.out.println(formatCN);
			return formatCN;
		}
		
		if(money2.length()<2) {
			if(money2.length() == 0) {
				money2 = "00";
			}else {
				money2 = money2  + "0";
			}
		}else {
			//如果小数点后面的位数大于两位,则只取前两位
			money2 = money.substring(point+1, point+3);
		}
		
		int len = money1_1.length();   //字符串反转之后,小数点之前的位数
		int pos = len - 1;
		String single = "";
		boolean allHaveNum = false;
		boolean haveNum = false;
		boolean mark = false;
		
		//输入的数字不能超过15位
		if(len>=16) {
			formatCN = "您输入的位数过大(整数部分不能超过15位),请重新输入";
			return formatCN;
		}
		while(pos>=0) {
			single = money1_1.substring(pos,pos+1);
			//if(pos>=8&&pos<12) {
				if(pos>=8) {
					if(!"0".equals(single)) {
						if(!mark) {
							formatCN = formatCN + numberCNN[Integer.parseInt(single)] + subMonetCN[pos%4];
						}else {
							if(allHaveNum) {
								formatCN = formatCN + "零";
							}
							formatCN = formatCN + numberCNN[Integer.parseInt(single)] + subMonetCN[pos%4];
							mark = false;
						}
						haveNum = true;
						allHaveNum = true;
					}else {
						mark = true;
					}
					
					if(pos%4==0&&pos!=8&&haveNum) {
						formatCN = formatCN + "万";
					}
					
					if(pos==8&&haveNum) {
						formatCN = formatCN + "亿";
						haveNum = false;
					}
				}
			
				if(pos>=4&&pos<8) {
					if(!"0".equals(single)) {
						if(!mark) {
							formatCN = formatCN + numberCNN[Integer.parseInt(single)] + subMonetCN[pos%4];
						}else {
							if(allHaveNum) {
								formatCN = formatCN + "零";
							}
							formatCN = formatCN + numberCNN[Integer.parseInt(single)] + subMonetCN[pos%4];	
							mark = false;
						}
						haveNum = true;
						allHaveNum = true;
					}else {
						mark = true;
					}
					if(pos%4==0&&haveNum) {
						formatCN = formatCN + "万";
						haveNum = false;
					}
				}
				
				if(pos>=0&&pos<4) {
					if(!"0".equals(single)) {
						if(!mark) {
							formatCN = formatCN + numberCNN[Integer.parseInt(single)] + subMonetCN[pos%4];	
						}else {
							if(allHaveNum) {
								formatCN = formatCN + "零";
							}
							formatCN = formatCN + numberCNN[Integer.parseInt(single)] + subMonetCN[pos%4];	
							mark = false;
						}
						haveNum = true;
						allHaveNum = true;
					}else {
						mark = true;
					}
				}
				pos--;
			}
			if(allHaveNum) {
				formatCN = formatCN + "元";
			}else {
				formatCN = formatCN + "零元";
			}
			
			if("00".equals(money2)) {
				formatCN = formatCN + "整";
			}else {
				if(money2.startsWith("0")||(allHaveNum&&money1.startsWith("0"))) {
					formatCN = formatCN + "零";
				}
				if(!money2.startsWith("0")) {
					formatCN = formatCN + numberCNN[Integer.parseInt(money2.substring(0,1))] + "角";
				}
				formatCN = formatCN + numberCNN[Integer.parseInt(money2.substring(1))] + "分";
			}
		
	}else {
		formatCN = "您输入的格式不正确,格式为:888.00";
	}
	return formatCN;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值