中文数字转换

CSDN论坛中有人提出一个整数转换为中文数字叫法的问题,该问题是一道笔试题,看似简单,但具体存在一些问题。参加讨论的人很多,我也写了一个程序,似乎基本能解决问题,记录在这里。
考虑主要有以下几种情况要注意:
1)一般情况下,正确地对应中文和数字的叫法,这主要是根据“拾佰仟万”以后应该再叫“拾佰仟”万,“亿”以后应该重复“拾佰仟万”亿来确定,所以,我们给出完整的单位序列应该是“拾佰仟万拾佰仟亿拾佰仟万”(由于整形的位数限制,到这里就够了);
2)出现0的情况,习惯上就应该有一个,而且只有一个零就够了,比如:1003应该叫做一千零三
3)当在万和亿以上的数字,如果出现0,应该加上万和亿的单位,如:10030叫一万零三叁拾,1003000040叫做一拾亿零叁佰万零四拾
4)特殊的,如果有1000000001应叫一拾亿零一,中间不要有万的情况出现
5)不能出现尾部有零的叫法
6)零和亿和万均不能直接连接
import java.util.*;
public class test {
    public static void main(String[] arg) {
        String d="拾佰仟万拾佰仟亿拾佰仟万";
        String s="零壹贰叁肆伍陆柒捌玖";
        boolean zero=false, fu=false;
        long value;
        int count=0;
        String Cvalue="";
        Scanner r=new Scanner(System.in);
        while(!r.hasNextInt()) {
            System.out.println("Must a integer can be inputted!");
            r.next();
        }
        value=r.nextInt();
        if(value==0) {//如果为零,直接输出
            Cvalue="零";
            System.out.println(Cvalue);
            return;
        }
        else if(value<0) {//做负数标记,以便以后统一处理
            value=java.lang.Math.abs(value);
            fu=true;
        }
        while(value>0) {
            int b=(int)(value % 10);
            if(!zero || b!=0) {//不是连续零,就需要转换数据
                String t="";
                if(b!=0) {//非零的正常情况
                    t=s.substring(b,b+1);
                    if(count>0) t+=d.substring(count-1,count);
                    zero=false;
                }
                else if(count!=4 && count!=8){//零的情况,且不是万和亿位,应该写零
                    t="零";
                    zero=true;
                }
                Cvalue=t+Cvalue;
            }
            if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;//在第万位,添加万
            if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;//在第亿位,添加亿
            count++;
            value/=10;
        }
        Cvalue=Cvalue.replaceFirst("亿万","亿");//排除亿万连接
        Cvalue=Cvalue.replaceFirst("零亿","亿");//排除零亿连接
        Cvalue=Cvalue.replaceFirst("零万","万");//排除零万连接
        if(Cvalue.endsWith("零")) Cvalue=Cvalue.substring(0,Cvalue.length()-1);//去除尾零
        if(fu) Cvalue="负的"+Cvalue;//添加负标记
        System.out.println(Cvalue);
    }
}
以下是一些例子:
1000000009:壹拾亿零玖
1023000009:壹拾亿贰仟叁佰万零玖
123000809:壹亿贰仟叁佰万零捌佰零玖
1230809:壹佰贰拾叁万零捌佰零玖
18009:壹万捌仟零玖
8092:捌仟零玖拾贰
-102000390:负的壹亿零贰佰万零叁佰玖拾
100:壹佰
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值