刚开始学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("个", "");//删除个位数的单位
}
}
希望大家指点。
/*
* 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("个", "");//删除个位数的单位
}
}
相关文章推荐
- 一个水晶报表的数字转换成中文大写的公式!
- Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换。
- Java中实现数字金额到中文大写字符的转换!!
- java 实验七 之 阿拉伯整数转换为中文大写数字(注意读法)
- .Net/C#/VB/T-SQL/Java 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- 一个将阿拉伯数字转换成中文大写的算法[C#]
- .Net/C#/VB/T-SQL/Java/Script 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- .Net/C#/VB/T-SQL/Java 实现: 将天文数字转换成中文大写 (2000 年前的思路,打劫的,一点儿技术含量都没有)
- java 中文大写数字 转换成 阿拉伯数字
- Java中实现数字金额到中文大写字符的转换!!
- 一个将阿拉伯数字转换成中文大写的最简单算法
- 使用 JAVA 将数字金额转换成大写中文金额
- 一个将阿拉伯数字转换成中文大写的最简单算法
- Java中实现数字金额到中文大写字符的转换!! 选择自 netfalcon 的 Blog
- 一个数字转中文大写货币数字的类.完美兼容于C#所有值类型转换和操作,beta版.希望大家多多纠正.
- java实现数字金额转换中文大写金额
- java 实现将String字符串大写中文数字转换成int类型整数
- java阿拉伯数字表示的金额转换成中文大写金额
- 一个将阿拉伯数字转换成中文大写的好算法(C#)
- 一个将阿拉伯数字转换成中文大写地好算法