打印人民币大写金额(PrnDaXieRMB)例程,这在财务系统中经常会用到。提供一个浮点数作为金额,程序把浮点数的阿拉伯数字转换成用汉字表示的中文大写金额。例程演示了条件运算符嵌套用法。
闲话少说,言归正传。直接上源码
先来看方法 prnInteger( long n ) 的/*** 版本1 begin*** 条件运算符嵌套写法 ***/部分,用一行三目条件运算符实现,省代码,但可读性极差。
/***版本一:用三目条件运算符实现***/
static String prnInteger( long n ) /***打印整数部分***/
{
/*循环变量说明:i,表示当前处理的阿拉伯数值;变量j,表示当前处理的是第j位。*/
//循环初始化语句
int i=0,j=0,old_i=0;
long num=n;
String str=""; //存放整数部分的大写金额字符串
while (true) { //这个是无限循环。甚至不需要用break语句跳出循环,直接用return结束。
if (num<10)
return (j==0) ? daXie[(int)num] : (str = daXie[(int)num] + level[j] + str) ;
i = (int)(num%10);
/*** 版本1 begin*** 条件运算符嵌套写法 ***/
str =( (j==0) ? ( (i==0) ? "" : daXie[i] ) : ( (i>0) ? ( daXie[i] +level[j] ) : (i==old_i) ? ((j==4)?level[j]:"") : ( (j==4) ? level[j] : daXie[i] ) ) )+str;
/*** 版本1 end***/
old_i = i; //old_i 作为连续"0"的判别标志
//下面二个是迭代语句
num = num/10; //截掉已处理的位
j++; //处理第几位,迭代
}
}
版本二,这个方法的条件语句版本。请看代码:
/***版本二:用条件语句实现***/
static String prnInteger2( long n ) /***打印整数部分***/
{
/*循环变量说明:i,表示当前处理的阿拉伯数值;变量j,表示当前处理的是第j位。*/
//循环初始化语句
int i=0,j=0,old_i=0;
long num=n;
String str=""; //存放整数部分的大写金额字符串
while (true) { //这个是无限循环。甚至不需要用break语句跳出循环,直接用return结束。
if (num<10)
return (j==0) ? daXie[(int)num] : (str = daXie[(int)num] + level[j] + str) ;
i = (int)(num%10);
/*** 版本1 begin*** 条件运算符嵌套写法 ***
str =( (j==0) ? ( (i==0) ? "" : daXie[i] ) : ( (i>0) ? ( daXie[i] +level[j] ) : (i==old_i) ? ((j==4)?level[j]:"") : ( (j==4) ? level[j] : daXie[i] ) ) )+str;
*** 版本1 end***/
/*** 版本2 begin*** if...elseif写法****/
if (j==0) //个位数处理。个位数没有level[j]
str = ( (i==0) ? "" : daXie[i] ) +str;
else { //不是个位数的处理。
//str = ( (i>0) ? ( daXie[i] +level[j] ) : (i==old_i) ? ((j==4)?level[j]:"") : daXie[i] ) +str;
if (i>0) // i>0的处理方式
str = ( daXie[i] +level[j] ) +str;
else { // i==0的特别处理。//对万位(j==4)需要显示“万”( level[j])。
//str = ( (i==old_i) ? ((j==4) ? level[j] : "") : ( (j==4) ? level[j] : daXie[i] ) ) +str;
if (i==old_i) //连续0情形。如果j==4是万位显示"万"(level[4])
str = ( (j==4) ? level[j] : "") +str;
else //第一个0情形。如果j==4需要显示"万"(level[4]),否则显示“零”
str = ( (j==4) ? level[j] : daXie[i] )+str;
}
}
/*** 版本2 end***/
old_i = i; //old_i 作为连续"0"的判别标志
//下面二个是迭代语句
num = num/10; //截掉已处理的位
j++; //处理第几位,迭代
}
}
特别说明:
上面程序中的字符串赋值语句:
str = daXie[(int)num] + level[j+1] + str;
因为有字符串连接顺序关系,不能替换为:str += daXie[(int)num] + level[j+1];
有兴趣者,请自行分析。
下面给出完整的打印人民币大写演示程序。
/*打印人民币大写金额处理例程*/
/***
* @author QiuGen
* @description 打印人民币大写金额处理例程
* 实现功能:打印人民币大写金额
* @date 2024/5/15
* ***/
public class PrnDaXieRMB { //圆、角、分 整
static String [] daXie = { "零","壹","贰","叁","肆","伍","陆","柒","捌","玖" };
/*数组level表示金额数值不同位置的中文,第一个“零”只是占位符,没有实际用途。*/
static String[] level = {"零","拾","佰","仟","万","拾","佰","仟","亿"};
static String getDaXie(double je)
{
String integerStr,decimalStr;
long num = 0L;
num = (long)je; //取得整数部分
//处理整数部分
integerStr = prnInteger( num );
//处理小数部分(je-num)
decimalStr = prnDecimal( je - num );
return integerStr + decimalStr;
}
/***版本一:用三目条件运算符实现***/
static String prnInteger( long n ) /***打印整数部分***/
{
/*循环变量说明:i,表示当前处理的阿拉伯数值;变量j,表示当前处理的是第j位。*/
//循环初始化语句
int i=0,j=0,old_i=0;
long num=n;
String str=""; //存放整数部分的大写金额字符串
while (true) { //这个是无限循环。甚至不需要用break语句跳出循环,直接用return结束。
if (num<10)
return (j==0) ? daXie[(int)num] : (str = daXie[(int)num] + level[j] + str) ;
i = (int)(num%10);
/*** 版本1 begin*** 条件运算符嵌套写法 ***/
str =( (j==0) ? ( (i==0) ? "" : daXie[i] ) : ( (i>0) ? ( daXie[i] +level[j] ) : (i==old_i) ? ((j==4)?level[j]:"") : ( (j==4) ? level[j] : daXie[i] ) ) )+str;
/*** 版本1 end***/
old_i = i; //old_i 作为连续"0"的判别标志
//下面二个是迭代语句
num = num/10; //截掉已处理的位
j++; //处理第几位,迭代
}
}
/***版本二:用条件语句实现***/
static String prnInteger2( long n ) /***打印整数部分***/
{
/*循环变量说明:i,表示当前处理的阿拉伯数值;变量j,表示当前处理的是第j位。*/
//循环初始化语句
int i=0,j=0,old_i=0;
long num=n;
String str=""; //存放整数部分的大写金额字符串
while (true) { //这个是无限循环。甚至不需要用break语句跳出循环,直接用return结束。
if (num<10)
return (j==0) ? daXie[(int)num] : (str = daXie[(int)num] + level[j] + str) ;
i = (int)(num%10);
/*** 版本1 begin*** 条件运算符嵌套写法 ***
str =( (j==0) ? ( (i==0) ? "" : daXie[i] ) : ( (i>0) ? ( daXie[i] +level[j] ) : (i==old_i) ? ((j==4)?level[j]:"") : ( (j==4) ? level[j] : daXie[i] ) ) )+str;
*** 版本1 end***/
/*** 版本2 begin*** if...elseif写法****/
if (j==0) //个位数处理。个位数没有level[j]
str = ( (i==0) ? "" : daXie[i] ) +str;
else { //不是个位数的处理。
//str = ( (i>0) ? ( daXie[i] +level[j] ) : (i==old_i) ? ((j==4)?level[j]:"") : daXie[i] ) +str;
if (i>0) // i>0的处理方式
str = ( daXie[i] +level[j] ) +str;
else { // i==0的特别处理。//对万位(j==4)需要显示“万”( level[j])。
//str = ( (i==old_i) ? ((j==4) ? level[j] : "") : ( (j==4) ? level[j] : daXie[i] ) ) +str;
if (i==old_i) //连续0情形。如果j==4是万位显示"万"(level[4])
str = ( (j==4) ? level[j] : "") +str;
else //第一个0情形。如果j==4需要显示"万"(level[4]),否则显示“零”
str = ( (j==4) ? level[j] : daXie[i] )+str;
}
}
/*** 版本2 end***/
old_i = i; //old_i 作为连续"0"的判别标志
//下面二个是迭代语句
num = num/10; //截掉已处理的位
j++; //处理第几位,迭代
}
}
static String prnDecimal( double decimal ) /***打印小数部分***/
{
long i,j;
//long a = (long)(100*decimal); //这样处理有误差
long a = (long)(100*decimal+0.1); //修正由double型数据可能引起的误差
if (a==0L)
{
return "圆整";
}
else {
i = a / 10;
j = a % 10;
if ( i*j != 0 ) return ("圆"+daXie[(int)i] +"角" +daXie[(int)j] + "分" +"整");
else { // 下面用三目运算符进行条件处理 i和j有一个是0的情形
return ( (i==0) ? ("圆"+"零" +daXie[(int)j] + "分" +"整") : ("圆" +daXie[(int)i]+ "角" +"整") ) ;
}
}
}
static void printRMB(double je)
{
System.out.println("金额小写:¥"+je+"元");
System.out.println("金额大写:"+getDaXie(je));
System.out.println("-------------------");
}
static void printRMB(long je)
{
System.out.println("金额小写:=¥"+je+"元");
System.out.println("金额大写:="+getDaXie(je));
}
public static void main(String[] args) {
double[] jeArray={29.00, 300207.50, 3.05,805000672.68,108.70,0.67,106700.26 };
long[] longJeArr = {5070080, 260000700};
for (double je : jeArray) printRMB(je);
for (long lje : longJeArr) printRMB(lje);
}
}
测试效果图如下所示: