您的位置:首页 > 编程语言 > Java开发

刚开始学Java,写了一个金额大写转换和中文大写数字转换的类

2008-09-20 02:11 555 查看
这几天刚刚开始学Java,想练练手,写了这个人民币金额大写转换,中文数字大写转换的类。
希望大家指点。

/*

* Copyright 2008 weijn2000@163.net

* ChineseNum类有2个Static方法:

* 1、UpperRMB(double money)用于转换符合票据使用的人民币大写金额

* 2、UpperNum(double Num,int Precision)用于数字大写

*/

package cn.igann;

/**

*

* @author Gann

*/

public class ChineseNum {

private static final char[] RMBUNITCHAR ={'分','角','圆','拾','佰','仟','万',

'拾','佰','仟','亿','拾','佰','仟','万','拾','佰','仟',

};

private static final char[] NUMUNITCHAR ={'个','拾','佰','仟','万','拾','佰',

'仟','亿','拾','佰','仟','万','拾','佰','仟', //个位数单位不发音

};

private static final char[] CHINESEDIGIT={

'零','壹','贰','叁','肆','伍','陆','柒','捌','玖',

};

/*

* 功能:UpperRMB(double money)将数字转换为人民币大写“圆角分”,符合票据要求

* 输入:Double类型 (如:9.45)

* 返回:人民币大写字符串 (如:玖圆肆角伍分)

* 注意:“角分”部分受double数据类型精度影响。例如数值大于几十万亿时,转换出来的

* 第二位小数可能会有点误差,整数部分越小,小数部分精确度越高

*/

public static String UpperRMB(double money){

int i;

String moneystr;

StringBuilder resultstr = new StringBuilder(); //比使用+连接更有效率

boolean zeroflag = false; //用于处理数字0

boolean unitflag = false; //解决数字中连续的0过多导致单位错误的问题

moneystr = String.format("%.2f",Math.abs(money)); //保留2位小数

moneystr = moneystr.replace(".", ""); //消除小数点

if(moneystr.length() > RMBUNITCHAR.length){

return "数值超出范围";

}

if(moneystr.equals("000")){

return "零圆整";

}

for(i = 0;i<moneystr.length();i++){ //逐位转换

if(moneystr.charAt(i) != '0'){ //处理非0数字

if(!zeroflag){ //此数字前一位不为0,直接转换为大写数字

resultstr.append(CHINESEDIGIT[moneystr.charAt(i)-'0']);

resultstr.append(RMBUNITCHAR[moneystr.length()-1-i]);

}

else{ //前面有零则加上“零”

resultstr.append(CHINESEDIGIT[0]);

resultstr.append(CHINESEDIGIT[moneystr.charAt(i)-'0']);

resultstr.append(RMBUNITCHAR[moneystr.length()-1-i]);

}

zeroflag = false; //读到非零数字,清除零标志

unitflag = false;

}

else{ //处理0数字

if(i==0){ //整数部分为0,跳过

if(moneystr.charAt(i+1) == '0'){ //跳过零圆零角

i++;

}

continue;

}

/*解决数字中间0太多时出现的问题:100000000010正确:壹仟亿零壹拾圆整

*防止出现 “壹仟亿万零壹拾圆整” 等情况*/

if(((!unitflag) &&((moneystr.length()-1-i) == 6)) //万

|| ((moneystr.length()-1-i) == 2) //圆

|| ((moneystr.length()-1-i) == 10) //亿

|| ((moneystr.length()-1-i) == 14)){ //万(亿)

resultstr.append(RMBUNITCHAR[moneystr.length()-1-i]);

unitflag = true; //解决0连续跨上述单位引起的问题

}

zeroflag = true; //表示读到0

}

}

//如果分数字为0,大写数字后面要加上“整”

if(moneystr.charAt(moneystr.length()-1)=='0'){

resultstr.append("整");

}

return resultstr.toString();

}

/*

* 功能:UpperNum(double Num,int Precision)将数字转换为中文大写形式

* 输入:Num为需要大写的实数,Precision为精度位数(如:(9.453,2))

* 返回:为中文大写字符串(如:玖点肆伍)。

* 注意:小数部分受double数据类型精度影响。例如数值大于几十万亿时,转换出来的

* 第二位小数可能会有点误差,整数部分越小,小数部分精确度越高

*/

public static String UpperNum(double Num,int Precision){

int i,dotpos;

String numstr;

StringBuilder resultstr = new StringBuilder(); //比使用+连接更有效率

boolean zeroflag = false; //用于处理数字0

boolean unitflag = false; //解决数字中连续的0过多导致单位错误的问题

boolean dotflag = false; //判断读到小数点与否

resultstr.append(Num >= 0 ? "":"负");

if(Precision < 0){ //精度值要确保大于等于0

numstr = String.format("%.2f",Math.abs(Num));

}

else{

numstr = String.format("%." + Precision + "f",Math.abs(Num));

}

dotpos = numstr.indexOf("."); //获取小数点位置

if(dotpos < 0){ //没有小数点,表示为整数

dotpos = numstr.length();

}

if(dotpos > NUMUNITCHAR.length){

return "数值超出范围";

}

for(i = 0;i<numstr.length();i++){ //开始逐位处理

if(numstr.charAt(i) == '.'){ //判断是否为小数点

resultstr.append("点");

dotflag = true;

continue;

}

if(dotflag){ //小数点后面部分数字

resultstr.append(CHINESEDIGIT[numstr.charAt(i)-'0']);

continue;

}

//小数点前面部分

if(numstr.charAt(i) != '0'){ //处理非0数字

if(!zeroflag){ //此数字前一位不为0,直接转换为大写数字

resultstr.append(CHINESEDIGIT[numstr.charAt(i)-'0']);

resultstr.append(NUMUNITCHAR[dotpos -1 - i]);

}

else{ //前面有零则加上“零”

resultstr.append(CHINESEDIGIT[0]);

resultstr.append(CHINESEDIGIT[numstr.charAt(i)-'0']);

resultstr.append(NUMUNITCHAR[dotpos -1 - i]);

}

zeroflag = false; //读到非零数字,清除零标志

unitflag = false;

}

else{ //处理0数字

if(i==0){ //整数部分为0

resultstr.append("零");

}

/*解决数字中间0太多时出现的问题:100000000010正确:壹仟亿零壹拾

*防止出现 “壹仟亿万零壹拾” 等情况*/

if(((!unitflag) &&(((dotpos - i) == 5))) //万

|| ((dotpos - i) == 9) //亿

|| ((dotpos - i) == 13)){ //万(亿)

resultstr.append(NUMUNITCHAR[dotpos -1 - i]);

unitflag = true; //解决0连续跨上述单位引起的问题

}

zeroflag = true; //表示读到0

}

}

return resultstr.toString().replace("个", "");//删除个位数的单位

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐