注:参考百度经验中的文章,并对其进行修改,使此工具类可以正常运行;
一、工具类
import java.text.DecimalFormat;
/**
* 對數字進行操作的工具類
*/
public class NumberUtil {
/**
* 將数字金额转换为中文大写
* @return_type:String
*/
public static String convert(double d){
DecimalFormat format = new DecimalFormat("#0.00");//格式化金额,避免科学计数
String str = format.format(d);
/*if (str.equals("0.00")){
str = "0.00";
};*/
String[] StrArr = str.split("\\.");//以小数点拆分整数和小数两部分,存入数组
String s = StrArr[0];
int len = StrArr[0].length();
String myStrInt = "";
String tmp;
String mydd;
String[] CurrNumHz = new String[]{"壹","贰","叁","肆","伍","陆","柒","捌","玖","零"};
String[] CurrNum = new String[]{"1","2","3","4","5","6","7","8","9","0"};
String[] CurrUnit = new String[]{"仟","佰","拾","亿","仟","佰","拾","万","仟","佰","拾","元"};
for (int i = 0; i < len ; i++){
tmp = s.substring(i, i+1);
//遍历整数部分各数字
for (int j = 0; j < CurrNum.length ; j++){
if (CurrNum[j].equals(tmp)) {//如果数字等于CurrNum里的元素
mydd=CurrUnit[CurrUnit.length-len+i];//得到元拾佰仟等货币单位
myStrInt = myStrInt + CurrNumHz[j]+mydd;//拼接大写字串
break;//满足条件退出内循环
}
}
}
//按照书写习惯格式化字符串
myStrInt = myStrInt.replace("零拾", "零");
myStrInt = myStrInt.replace("零佰", "零");
myStrInt = myStrInt.replace("零仟", "零");
myStrInt = myStrInt.replace("零零零", "零");
myStrInt = myStrInt.replace("零零", "零");
myStrInt = myStrInt.replace("零万", "万");
myStrInt = myStrInt.replace("零亿", "亿");
myStrInt = myStrInt.replace("零元", "元");
if (myStrInt.equals("元")) {
myStrInt = "零元";
}
//处理小数部分
s = StrArr[1];
if ((myStrInt.equals("零元") == true) && (s.equals("00") == false)){
myStrInt = "";
}
len = StrArr[1].length();//实际上len始终等于2,因为"#0.00"的规定
String myStrDec = "";
//以下算法与整数部分相同,不再赘述
CurrNumHz = new String[]{"壹","贰","叁","肆","伍","陆","柒","捌","玖","零"};
CurrNum = new String[]{"1","2","3","4","5","6","7","8","9","0"};
CurrUnit = new String[]{"角","分"};
for (int i = 0; i < len ; i++){
tmp = s.substring(i, i+1);
for (int j = 0; j < CurrNum.length ; j++){
if (CurrNum[j].equals(tmp)) {
mydd=CurrUnit[CurrUnit.length-len+i];
myStrDec = myStrDec + CurrNumHz[j]+mydd;
break;
}
}
}
myStrDec = myStrDec.replace("零分", "");
myStrDec = myStrDec.replace("零角", "");
if ((myStrInt.indexOf("元") > 0) && (myStrDec.indexOf("分") > 0) && (myStrDec.indexOf("角") == -1)) {
myStrDec = "零" + myStrDec;//形如1.03,角位插入“零”
}
if (myStrDec.equals("") == true){
myStrInt += "整"; //没有小数,则整数部分末尾加上“整”
}
String ResultStr = myStrInt + myStrDec;//合并整数与小数的字串
return ResultStr; //返回结果
}
}
二、测试
/**
* 測試將数字金额转换为中文大写1
* @return_type:void
*/
@Test
public void test2() {
System.out.println("请输入一个金额(最大到千亿,如有小数,只保留2位小数即角分):");
Scanner scan=new Scanner(System.in);
double mynum = scan.nextDouble(); //得到输入的金额
DecimalFormat format = new DecimalFormat("#0.00"); //格式化金额,避免科学计数
String str = format.format(mynum);
System.out.println("str:" + str);
String[] StrArr = str.split("\\."); //以小数点拆分整数和小数两部分,存入数组
int len = StrArr[0].length();
if (len > 12) {
System.out.println("超过范围"); //限定最大整数部分到千亿
return;
}
//將数字金额转换为中文大写,并返回
str = NumberUtil.convert(mynum);//调用convert函数计算得到结果
System.out.println(str);//显示结果
}
/**
* 測試將数字金额转换为中文大写2
* @return_type:void
*/
@Test
public void test3() {
double d = 0;
String result = NumberUtil.convert(d);
System.out.println("人民币" + result);
}