java程序实现金额大小写转换,大写金额转换为小写数字,金额转换为大写中文实例

java程序实现金额大小写转换,大写金额转换为小写数字,金额转换为大写中文实例,

金额大小写转换,金额转换为大写中文,大写金额转换为小写数字

经测试已经基本无BUG。

写之前对照别人代码进行了互相的金额转换测试。

并依此修正了自己的BUG。别人的代码还是有BUG的。

参考列表:

http://java.chinaitlab.com/net/744688.html

http://468030.blog.51cto.com/458030/94327

http://blog.163.com/zcy4123@126/blog/static/15525587720121325532523/

http://yoyo08.iteye.com/blog/572295

http://www.dewen.org/q/4673/%E9%87%91%E9%A2%9D%E5%A4%A7%E5%B0%8F%E5%86%99%E7%9A%84%E8%BD%AC%E6%8D%A2

其中很多都有BUG

 

import java.text.DecimalFormat;

/**
*
* 金额大小写转换
*
* @author mfanw
* @time 2012-09-11
*/
public class Currency {

public static String NUMB = ”零壹贰叁肆伍陆柒捌玖”;
public static String UNIT = ”元拾佰仟万拾佰仟亿拾佰仟”;

/**
* 转换为大写(小数部分无效)
* @param money 例如:1209900.00
* @return
*/
public static String toChinese(String money){
/**
* 1.确保是Double数值,并且含两位小数部分
*/
DecimalFormat df = new DecimalFormat(“########0.00″);
money = ”" + df.format(Double.parseDouble(money));
String ret = ”";
/**
* 2.替换为中文数值(含单位)
*/
String moneyI = money.substring(0, money.indexOf(“.”));//舍弃小数点及以后部分
int i = 0;
while (i < moneyI.length()) {
int nowNumb = Integer.parseInt(“”+moneyI.charAt(i));//获取数
int nowUnit = moneyI.length()-i-1;//根据此值在整个数值中的位置获取单位
if(nowNumb == 0){//零的情况:零后不用跟单位
if(nowUnit%4==0){//万、亿为特殊单位,必加项
ret += UNIT.charAt(nowUnit);
} else if(ret.charAt(ret.length()-1) != ’零’){//防止添加多个零
ret += ”零”;
}
} else {//非零情况
ret += NUMB.charAt(nowNumb);//添加数
ret += UNIT.charAt(nowUnit);//添加位
}
i++;
}
/**
* 3.标准化格式
*/
ret = ret.replaceAll(“零亿”, ”亿”);
ret = ret.replaceAll(“零万”, ”万”);
ret = ret.replaceAll(“零元”, ”元”);
if(ret.length() == 1){
ret = ”零元”;
}
return ret;
}

/**
* 转换为小写(小数部分无效)
* @param money 例如:壹仟贰佰叁拾肆万伍仟陆佰柒拾捌元
* @return
*/
public static String toNumber(String money){
double ret = 0, temp = 0;
int nowNumb = 0,tInt = 0, i = 0, j = 0;
while (i < money.length()) {
tInt = NUMB.indexOf(money.charAt(i));
if(tInt>-1){//数值情况
nowNumb = tInt;
if(tInt>0){//非零情况,零直接跳过,无须处理
j = UNIT.indexOf(money.charAt(i+1));
if(j>0 && j<4){//单位为 <拾佰仟> 的情况
temp += nowNumb * Math.pow(10, j);
i++;//下次循环跳过刚刚读过的 <拾佰仟> 单位
}else{//单位为其他情况的,直接把结果暂存到 temp
temp += nowNumb;
}
}
}else{//非数值情况,将暂存temp根据单位存到ret中,并清空暂存temp
if(money.charAt(i)==’亿’){
ret += temp * 10000 * 10000;
temp = 0;
} else if(money.charAt(i)==’万’){
ret += temp * 10000;
temp = 0;
} else if(money.charAt(i)==’元’) {
ret += temp;
temp = 0;
}
}
i++;
}
DecimalFormat df = new DecimalFormat(“########0.00″);
return ”" + df.format(ret);
}
/**
* @param args
*/
public static void main(String[] args) {
//  System.out.println(NewChinese2.toChinese(“10230398003″));
System.out.println(Currency.toNumber(Currency.toChinese(“21″)));
DecimalFormat df = new DecimalFormat(“########0.00″);
String num1 = ”";
String str1 = ”";
String num2 = ”";
for(int i=Integer.MAX_VALUE/10000*9999;i<Integer.MAX_VALUE;i++){
num1 = ”" + df.format(i);
str1 = Currency.toChinese(num1);
num2 = Currency.toNumber(str1);
if(num1.equals(num2)){
//    System.out.println(num1 + ” ”);
}else{
System.out.println(num1 + ”\t” + num2);
}
}

}

} 本文链接地址: java程序实现金额大小写转换,大写金额转换为小写数字,金额转换为大写中文实例