金额转换成RMB大写

public class TestToChinessCurrency {
	public static void main(String[] args) {
		TestToChinessCurrency tcc = new TestToChinessCurrency();
		System.out.println(tcc.transfNumToCString("108010001800.01"));
	}

	/**
	 * 将数字转换成大写金额
	 * @param number
	 * 			待转换的数字
	 * @return
	 * 			大写金额
	 */
	private String transfNumToCString(String number) {
		// 校验是否数字
		try {
			Double.parseDouble(number);
		} catch (NumberFormatException e) {
			return null;
		}
		
		// 转换操作
		try {
			String result = ""; // 返回值
			// 是否含有小数部分,默认false
			boolean bHasDot = false;
			int dotIdx = number.indexOf(".");
			if (dotIdx == -1) {
				// 没有小数点,将小数点的位置设置成末尾
				dotIdx = number.length();
			} else {
				bHasDot = true;
			}
			
			// 获取整数部分、小数部分
			String beforeDot = number.substring(0, dotIdx).trim();
			String afterDot = number.substring(dotIdx);
			
			/* 处理整数部分 */
			/**
			 * 圆、拾圆、佰圆、仟圆、万、拾万、佰万、仟万、亿、拾亿、佰亿、仟亿
			 * 分为3大级:"圆", "万", "亿",每大级下又有4小级
			 */
			String[] unit = { "圆", "万", "亿"};
			String[] subunit = { "拾", "佰", "仟" };
			
			// 定义所需变量
			int count = 0;                // 循环处理计数器
			int subunitCnt = 0;           // 小级计数器
			int unitCnt = 0;              // 大级计数器
			char oldC = '3';              // 上一处理字符,默认3
			char cc = '0';                // 当前处理字符,默认0
			String zero = "零";           // 0转换字符
			int len = beforeDot.length(); // 整数部分长度
			boolean hasN = false;         // 一次小级循环处理下来是否有非0数字
			boolean oldHasN = false;      // 上一次小级循环处理下来是否有非0数字
			boolean allZero = true;       // 是否全零
			// 开始让,加上大级最低单位,result="圆"
			result = unit[0] + result;    
			// 循环处理每位数
			for (count = 0; count < len; ++count) {
				// 如果小级计数器到0且循环计数器非0,即万级、亿级开始
				if ((subunitCnt == 0) && (count != 0)) {
					// 上一大级循环没有非0数字
					if (!hasN) { 
						// 如果亿级,这时万级都是0,截去result中“万”
						if (unitCnt % 2 == 0) {
							result = result.substring(1);
						}
					} else if (oldC == '0') {
						// 上一大级循环存在非0数字,且上一处理位0,即小级循环中仟为为零
						result = zero + result;
					}
					
					// 加上本次大级单位
					result = unit[unitCnt] + result;
					// 先将hasN值赋予oldHasN,然后重置hasN为false
					oldHasN = hasN;
					hasN = false;
				}
				
				// 从个位开始处理
				cc = beforeDot.charAt(len - count - 1);
				
				// 上一处理字符、当前处理字符是否都为0,且本次大级循环已出现非0数字
				if (oldC == '0' && cc != oldC && hasN) {
					result = zero + result;
				}
				
				// 当前处理字符不为0
				if (cc != '0') {
					// 小级到“拾”及以后,加上小级单位
					if (subunitCnt != 0) {
						result = subunit[subunitCnt - 1] + result;
					}
					
					// 当前数字转换成大写
					String ccStr = this.convertNum(cc);
					// 连接上
					result = ccStr + result;
					// hasN应置为true
					hasN = true;
					// allZero应置为false
					allZero = false;
				}
				
				// 当前处理字符cc赋予oldC
				oldC = cc;
				
				// 小级计数器++
				++subunitCnt;
				// 如果小级计数器到4,则大级计数器++且小级计数器置零
				if (subunitCnt == 4) {
					++unitCnt;
					subunitCnt = 0;
				}
			}
			
			// 对上述处理结果再处理
			if (allZero) {
				// 全0,对result赋值
				result = "零圆";
			} else {
				// 截去result第一个字符可能出现的零
				int zeroCnt = 0;
				// 亿、万级全是0(不需要考虑第一级)
				if (!hasN) {
					++zeroCnt;
					if (!oldHasN) {
						++zeroCnt;
					}
				}
				if (zeroCnt != 0) {
					result = result.substring(zeroCnt);
				}
				
				// 如果result第一个字符还是零,截去,38646对应“零”
				if (result.charAt(0) == (char)38646) {
					result = result.substring(1);
				}
			}

			// 处理小数部分
			if (bHasDot) {
				// 干掉小数点
				afterDot = afterDot.substring(1).trim();
				
				// 小数部分单位 
				String[] cornunit = { "角", "分" };
				
				// 小数部分长度,最多两位
				len = afterDot.length();
				// 用于存小数数值
				char[] corn = new char[2];
				// 角
				corn[0] = afterDot.charAt(0);
				// 分,不存在赋值0
				if (len > 1) {
					corn[1] = afterDot.charAt(1);
				} else {
					corn[1] = '0';
				}
				
				// 如果角、分都为0,为整圆
				if (corn[0] == '0' && corn[1] == '0') {
					return result += "整";
				}
				
				// 处理小数部分之前,如果整数部分全0, 先置result为空串
				if (allZero) {
					result = "";
				}
				for (int i = 0; i < 2; ++i) {
					// 处理角、分
					char curchar = corn[i];
					String curStr = this.convertNum(curchar);
					result = result + curStr;
					
					// 角
					if (i == 0) {
						if (curchar != '0') {
							// 存在角值,加上单位
							result = result + cornunit[0];
						} else if (allZero) {
							// 没角值,且整数部分全0,置result为空串
							result = "";
						}
					}
					// 分,肯定存在值,否则到不了这
					if (i == 1) {
						result = result + cornunit[1];
					}
				}
			} else {
				result = result + "整";
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	/**
	 * 将1、2、3...转换成壹、贰、叁
	 * @param num
	 * 			数字
	 * @return
	 * 			大写中文数字
	 */
	private String convertNum(char num) {
		String numStr = "";
		switch (num) {
			case '1':
				numStr = "壹";
				break;
			case '2':
				numStr = "贰";
				break;
			case '3':
				numStr = "叁";
				break;
			case '4':
				numStr = "肆";
				break;
			case '5':
				numStr = "伍";
				break;
			case '6':
				numStr = "陆";
				break;
			case '7':
				numStr = "柒";
				break;
			case '8':
				numStr = "捌";
				break;
			case '9':
				numStr = "玖";
			case '0':
				numStr = "零";
		}
		
		return numStr;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用MySQL中的自定义函数来将金额转换为汉字大写。以下是一个示例的MySQL函数,可以实现将金额转换为汉字大写的功能: ```sql DELIMITER $$ CREATE FUNCTION num_to_rmb(IN num DECIMAL(18, 2)) RETURNS VARCHAR(255) BEGIN DECLARE result VARCHAR(255); DECLARE integer_part INT; DECLARE decimal_part INT; DECLARE temp VARCHAR(255); SET result = ''; SET integer_part = FLOOR(num); SET decimal_part = ROUND((num - integer_part) * 100); IF integer_part = 0 THEN SET result = '零元'; ELSE SET temp = ''; IF integer_part >= 100000000 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 100000000)), '亿'); SET integer_part = integer_part % 100000000; END IF; IF integer_part >= 10000 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 10000)), '万'); SET integer_part = integer_part % 10000; END IF; IF integer_part >= 1000 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 1000)), '仟'); SET integer_part = integer_part % 1000; END IF; IF integer_part >= 100 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 100)), '佰'); SET integer_part = integer_part % 100; END IF; IF integer_part >= 10 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 10)), '拾'); SET integer_part = integer_part % 10; END IF; IF integer_part > 0 THEN SET temp = CONCAT(temp, num_to_rmb(integer_part)); END IF; SET result = CONCAT(temp, '元'); END IF; IF decimal_part = 0 THEN SET result = CONCAT(result, '整'); ELSE IF decimal_part >= 10 THEN SET result = CONCAT(result, num_to_rmb(FLOOR(decimal_part / 10)), '角'); SET decimal_part = decimal_part % 10; END IF; IF decimal_part > 0 THEN SET result = CONCAT(result, num_to_rmb(decimal_part), '分'); END IF; END IF; RETURN result; END$$ DELIMITER ; ``` 创建完上述函数后,您可以使用以下方式将金额转换为汉字大写: ```sql SELECT num_to_rmb(12345.67) AS rmb_amount; ``` 该查询将返回"壹万贰仟叁佰肆拾伍元陆角柒分",表示金额为12345.67的汉字大写形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值