这种小程序:非常实用,尤其是在银行里的支票上的金额显示(呈现的就是汉字形式)
/**
*编码将输入的整数数字翻译成对应的中文形式(输入的数字首字母不能为0,除非它是0)
*/
import java.util.Scanner;
public class N2C2023
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入待翻译的十进制整数:");
String input = sc.next();
System.out.print(input + "翻译成中文数字为:");
/**
*1. 1234--->一千两百三十四
*2. 1001--->一千零一(零的时候不输出单位,连续多个零只输出一个零(后面有非零的数)或者不输出)
*3. 0101--->一百零一(首位的零不需要输出(它是最高位))
*4. 1100--->一千一百(后面连续的零不需要输出)
*5. 39070100--->三千九百零七万零一百(从右边开始,每4位为一组,组间有单位:" ","万","亿")
* 组内每个数也有单位:(从右向左):"","十","百","千"
*总的翻译原则:从左到右,分组翻译(数+单位),然后再输出组间的单位。
*项目难点:零的处理!
*/
String[] dname = {"零","一","二","三","四","五","六","七","八","九"}; //数字的汉字名
String[] zdw = {" ","十","百","千"}; //组内各数的单位
String[] jdw = {" ","万","亿","万亿","亿亿"}; //节的单位
//需要记录的几个状态信息
//1.组内是否全为0?count变量统计组内0的个数,如果为4,则全为0。
//2.组内是否出现0?组内后面出现非零的数时,需要补偿输出零。isYes = true需要补偿输出零,否则无需输出零。
//3.当前数字是否处于:组内还是组间(小节结束)?
int count = 0; //统计组内0的个数
boolean isYes = false; //是否需要补偿输出零
int len = input.length();
//从左向右,依次处理输入字符串中的每一个字符
for(int i = 0; i < len; i++)
{
int d = input.charAt(i) - '0'; //'1' ---> 1
if(d == 0)
{
count++; //统计组内零的个数,如果遇到新的组,则count清0
if(!isYes)
{
isYes = true; //后面如果组内还有非零的数字,则需要补偿输出零
}
}
else //非零数字的处理
{
if(isYes) //需要补偿输出零
{
System.out.print("零" + dname[d]);
isYes = false;
}
else
{
System.out.print(dname[d]);
}
}
//输出该数字的单位:考虑当前数字是否为组间的位置,如果是,再输出组间的单位,否则只需要输出组内的单位
if((len - i) % 4 == 1)//组间:1 0000 1 2345 6789
{
if(count != 4)
{
System.out.print(jdw[(len - i) / 4]); //本小节不全为0,必须输出小节(组间)的单位
}
count = 0; //小节结束,为统计下一组内的零做准备
}
else
{
if(d != 0)
{
System.out.print(zdw[(len - 1 - i) % 4]); //输出组内每个数的单位
}
}
}
if(isYes && (len == 1))
{
System.out.print("零");
}
System.out.println();
}
}
结果的简单展示: