【三目条件运算符】条件语句应用实例:打印人民币大写金额

打印人民币大写金额(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);
	}
}

测试效果图如下所示:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值