您的位置:首页 > 其它

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

2012-03-15 17:23 246 查看
我们在参与大型项目时,难免会遇到数值转换人民币大写的情况。因为我今天接触了一个这样的转换,但原代码存在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,欢迎拍砖留言!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: