关于数字转换成人民币大写的问题

我们在参与大型项目时,难免会遇到数值转换人民币大写的情况。因为我今天接触了一个这样的转换,但原代码存在BUG,转换经常出现问题。于是我就去网上搜索了相关资源。由于没有找到相对权威的转换代码,网上给出的转换方式也是参差不齐。于是,我参考网友相对成熟的思路加以修改、优化,最终写出了自己的转换方法。

下面贴出代码:

	/**
	 * 采用分段的方式将给定小写金额转换成中文大写形式<br/>
	 * 从小数点开始向前数,四位为一段<br/>
	 * 支持整数位最多13位、小数位最多2位,多于两位的小数会被忽略<br/>
	 * 
	 * @param value
	 *            小写金额
	 * @return 转换后的中文大写字符串
	 */
	public static String toBigMode(double value)
	{
		final char[] NUMBER_CHAR = "零壹贰叁肆伍陆柒捌玖".toCharArray(); // 大写数字
		final String[] IN_UNIT_CHAR = { "", "拾", "佰", "仟" }; // 段内字符
		final String[] UNIT_NAME = { "", "万", "亿", "万亿" }; // 段名

		// 金额乘100并转换成整数字符串(取出元角分数值)
		String valStr = new BigDecimal(Double.toString(value)).multiply(
				new BigDecimal("100")).toString();
		if(valStr.indexOf(".") > 0)
		{
			valStr = valStr.substring(0, valStr.indexOf("."));
		}

		StringBuilder prefix = new StringBuilder(); // 整数部分转化的结果
		StringBuilder suffix = new StringBuilder(); // 小数部分转化的结果

		if (valStr.length() <= 2) // 只有小数部分
		{
			prefix.append("零元");
			if (valStr.equals("0"))
			{
				suffix.append("零角零分");
			} else if (valStr.length() == 1)
			{
				suffix.append(NUMBER_CHAR[valStr.charAt(0) - '0']).append("分");
			} else
			{
				suffix.append(NUMBER_CHAR[valStr.charAt(0) - '0']).append("角");
				suffix.append(NUMBER_CHAR[valStr.charAt(1) - '0']).append("分");
			}
		} else
		{
			int flag = valStr.length() - 2;
			String head = valStr.substring(0, flag); // 取整数部分
			String rail = valStr.substring(flag); // 取小数部分

			if (head.length() > 13)
			{
				return "数值太大(最大支持13位整数),无法处理。";
			}

			// 处理整数位
			char[] ch = head.toCharArray();
			int zeroNum = 0; // 连续零的个数
			for (int i = 0; i < ch.length; i++)
			{
				int index = (ch.length - i - 1) % 4; // 取段内位置,介于 3 2 1 0
				int indexLoc = (ch.length - i - 1) / 4; // 取段位置,介于 3 2 1 0

				if (ch[i] == '0')
				{
					zeroNum++;
				} else
				{
					if (zeroNum != 0)
					{
						if (index != 3)
						{
							prefix.append("零");
						}
						zeroNum = 0;
					}
					prefix.append(NUMBER_CHAR[ch[i] - '0']); // 转换该位置的数

					prefix.append(IN_UNIT_CHAR[index]); // 添加段内标识
				}

				if (index == 0 && zeroNum < 4) // 添加段名
				{
					prefix.append(UNIT_NAME[indexLoc]);
				}
			}
			prefix.append("元");

			// 处理小数位
			if (rail.equals("00"))
			{
				suffix.append("整");
			} else if (rail.startsWith("0"))
			{
				suffix.append(NUMBER_CHAR[rail.charAt(1) - '0']).append("分");
			} else
			{
				suffix.append(NUMBER_CHAR[rail.charAt(0) - '0']).append("角");
				suffix.append(NUMBER_CHAR[rail.charAt(1) - '0']).append("分");
			}
		}

		return prefix.append(suffix).toString();
	}

源码下载地址:https://code.csdn.net/snippets/609078/master/download

此方法参考了网友Davis129转载的文章人民币大写转换,但又有诸多修改和优化。经本人简单测试,该代码基本上可以满足需要。虽然代码经过了多次测试,但难免存在未知BUG,欢迎拍砖留言!


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,我可以为您解答这个问题。 Oracle中可以使用PL/SQL代码将数字转换为人民币大写。以下是一个示例代码: ``` CREATE OR REPLACE FUNCTION f_num2rmb(p_num IN NUMBER) RETURN VARCHAR2 IS l_num NUMBER := TRUNC(p_num); l_dec NUMBER(2,0) := TRUNC(MOD(p_num, 1) * 100); l_rmb VARCHAR2(200); l_unit CONSTANT VARCHAR2(10) := '元'; l_decimal CONSTANT VARCHAR2(10) := '角分'; l_numstr CONSTANT VARCHAR2(50) := '零壹贰叁肆伍陆柒捌玖'; l_unitstr CONSTANT VARCHAR2(50) := '仟佰拾'; l_decimalstr CONSTANT VARCHAR2(50) := '分角'; BEGIN IF l_num = 0 AND l_dec = 0 THEN RETURN '零元整'; END IF; l_rmb := TO_CHAR(l_dec, 'FM00') || l_decimal; FOR i IN 1..4 LOOP l_unitstr := SUBSTR(l_unitstr, 2); IF l_num = 0 THEN EXIT; END IF; l_rmb := SUBSTR(l_numstr, MOD(TRUNC(l_num / POWER(10, (4 - i) * 4)), 10) + 1, 1) || l_unitstr || l_rmb; l_num := TRUNC(l_num / 10); END LOOP; l_rmb := REPLACE(l_rmb, '零仟', '零'); l_rmb := REPLACE(l_rmb, '零佰', '零'); l_rmb := REPLACE(l_rmb, '零拾', '零'); l_rmb := REPLACE(l_rmb, '零零零', '零'); l_rmb := REPLACE(l_rmb, '零零', '零'); l_rmb := REPLACE(l_rmb, '零角零分', '整'); IF SUBSTR(l_rmb, 1, 1) = '零' THEN l_rmb := SUBSTR(l_rmb, 2); END IF; RETURN l_rmb || l_unit || '整'; END; / ``` 使用该函数,可以将数字转换为人民币大写。例如: ``` SELECT f_num2rmb(12345.67) FROM DUAL; ``` 输出结果为: ``` 壹万贰仟叁佰肆拾伍元陆角柒分整 ``` 这个函数的代码实现比较复杂,但是可以通过调用该函数来轻松地将数字转换为人民币大写

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值