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

我们在参与大型项目时,难免会遇到数值转换人民币大写的情况。因为我今天接触了一个这样的转换,但原码存在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 = { "", "万", "亿", "万亿" }; // 段名 long longValue = (long) (value * 100); // 转换成整数 // System.out.println(longValue); String valStr = new BigDecimal(Math.ceil(longValue)).toString(); // 转换成字符串 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(); }

源码下载地址:http://download.csdn.net/detail/binbinxyz/4143816

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 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; ``` 输出结果为: ``` 壹万贰仟叁佰肆拾伍元陆角柒分整 ``` 这个函数的代码实现比较复杂,但是可以通过调用该函数来轻松地将数字转换为人民币大写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值