Java实现阿拉伯数字转换成中文大写数字,以及中文大写数字到阿拉伯数字的转换。_java 数字大写转阿拉伯数字-程序员宅基地

技术标签: 算法  阿拉伯数字与中文大写数字之间的转换  

学习王晓华老师的《算法的乐趣》一书中第四章之后,用Java重写并实现这一功能。微笑

该文章是在学习完该章之后的一个学习总结,以供自己复习使用。

由于现在刚开始学习Java,为了熟悉Java的变成规范,因此,用Java实现这一功能。

public class NumberToChn {
    static String CHN_NUMBER[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    static String CHN_UNIT[] = {"", "十", "百", "千"};          //权位
    static String CHN_UNIT_SECTION[] = {"", "万", "亿", "万亿"}; //节权位

    /**
     * 测试数据的数据类型
     */
    public static class Test_Data{
        int number;
        String chnNum;
        public Test_Data(int number,String chnNum){
            this.chnNum=chnNum;
            this.number=number;
        }
    }

    /**
     * 测试数据
     */
    static Test_Data testData[]={
            new Test_Data(0,"零"),
            new Test_Data(1,"一"),
            new Test_Data(2,"二"),
            new Test_Data(3, "三"),
            new Test_Data(4, "四"),
            new Test_Data(5, "五"),
            new Test_Data(6, "六"),
            new Test_Data(7, "七"),
            new Test_Data(8, "八"),
            new Test_Data(9, "九"),
            new Test_Data(10, "一十"),
            new Test_Data(11, "一十一"),
            new Test_Data(110, "一百一十"),
            new Test_Data(111, "一百一十一"),
            new Test_Data(100, "一百"),
            new Test_Data(102, "一百零二"),
            new Test_Data(1020, "一千零二十"),
            new Test_Data(1001, "一千零一"),
            new Test_Data(1015, "一千零一十五"),
            new Test_Data(1000, "一千"),
            new Test_Data(10000, "一万"),
            new Test_Data(20010, "二万零一十"),
            new Test_Data(20001, "二万零一"),
            new Test_Data(100000, "一十万"),
            new Test_Data(1000000, "一百万"),
            new Test_Data(10000000, "一千万"),
            new Test_Data(100000000, "一亿"),
            new Test_Data(1000000000, "一十亿"),
            new Test_Data(1000001000, "一十亿一千"),
            new Test_Data(1000000100, "一十亿零一百"),
            new Test_Data(200010, "二十万零一十"),
            new Test_Data(2000105, "二百万零一百零五"),
            new Test_Data(20001007, "二千万一千零七"),
            new Test_Data(2000100190, "二十亿零一十万零一百九十"),
            new Test_Data(1040010000, "一十亿四千零一万"),
            new Test_Data(200012301, "二亿零一万二千三百零一"),
            new Test_Data(2005010010, "二十亿零五百零一万零一十")
//            new Test_Data(4009060200, "四十亿零九百零六万零二百"),
//            new Test_Data(4294967295, "四十二亿九千四百九十六万七千二百九十五")


    };

    /**
     * 阿拉伯数字转换为中文数字的核心算法实现。
     * @param num为需要转换为中文数字的阿拉伯数字,是无符号的整形数
     * @return
     */
    public static String NumberToChn(int num) {
        StringBuffer returnStr = new StringBuffer();
        Boolean needZero = false;
        int pos=0;           //节权位的位置
        if(num==0){
            //如果num为0,进行特殊处理。
            returnStr.insert(0,CHN_NUMBER[0]);
        }
        while (num > 0) {
            int section = num % 10000;
            if (needZero) {
                returnStr.insert(0, CHN_NUMBER[0]);
            }
            String sectionToChn = SectionNumToChn(section);
            //判断是否需要节权位
            sectionToChn += (section != 0) ? CHN_UNIT_SECTION[pos] : CHN_UNIT_SECTION[0];
            returnStr.insert(0, sectionToChn);
            needZero = ((section < 1000 && section > 0) ? true : false); //判断section中的千位上是不是为零,若为零应该添加一个零。
            pos++;
            num = num / 10000;
        }
        return returnStr.toString();
    }

    /**
     * 将四位的section转换为中文数字
     * @param section
     * @return
     */
    public static String SectionNumToChn(int section) {
        StringBuffer returnStr = new StringBuffer();
        int unitPos = 0;       //节权位的位置编号,0-3依次为个十百千;

        Boolean zero = true;
        while (section > 0) {

            int v = (section % 10);
            if (v == 0) {
                if ((section == 0) || !zero) {
                    zero = true; /*需要补0,zero的作用是确保对连续的多个0,只补一个中文零*/
                    //chnStr.insert(0, chnNumChar[v]);
                    returnStr.insert(0, CHN_NUMBER[v]);
                }
            } else {
                zero = false; //至少有一个数字不是0
                StringBuffer tempStr = new StringBuffer(CHN_NUMBER[v]);//数字v所对应的中文数字
                tempStr.append(CHN_UNIT[unitPos]);  //数字v所对应的中文权位
                returnStr.insert(0, tempStr);
            }
            unitPos++; //移位
            section = section / 10;
        }
        return returnStr.toString();
    }

    /**
     * 完成将阿拉伯数字转换为中文数字的测试
     */
    public static void TestNumToChn(){
        for(int i=0;i<testData.length;i++) {
            String str=NumberToChn(testData[i].number);
            System.out.println(testData[i].number+"\t"+testData[i].chnNum+"\t"+str+"\t"+str.equals(testData[i].chnNum));
        }
    }


    /**
     * 中文转换成阿拉伯数字,中文字符串除了包括0-9的中文汉字,还包括十,百,千,万等权位。
     * 此处是完成对这些权位的类型定义。
     * name是指这些权位的汉字字符串。
     * value是指权位多对应的数值的大小。诸如:十对应的值的大小为10,百对应为100等
     * secUnit若为true,代表该权位为节权位,即万,亿,万亿等
     */
    public static class Chn_Name_value{
        String name;
        int value;
        Boolean secUnit;
        public Chn_Name_value(String name,int value,Boolean secUnit){
            this.name=name;
            this.value=value;
            this.secUnit=secUnit;
        }
    }

    static Chn_Name_value chnNameValue[]={
            new Chn_Name_value("十",10,false),
            new Chn_Name_value("百",100,false),
            new Chn_Name_value("千",1000,false),
            new Chn_Name_value("万",10000,true),
            new Chn_Name_value("亿",100000000,true)
    };

    /**
     * 返回中文数字汉字所对应的阿拉伯数字,若str不为中文数字,则返回-1
     * @param str
     * @return
     */
    public static int ChnNumToValue(String str){
        for(int i=0;i<CHN_NUMBER.length;i++){
            if(str.equals(CHN_NUMBER[i])){
                return i;
            }
        }
        return -1;
    }

    /**
     * 返回中文汉字权位在chnNameValue数组中所对应的索引号,若不为中文汉字权位,则返回-1
     * @param str
     * @return
     */
    public static int ChnUnitToValue(String str){
        for(int i=0;i<chnNameValue.length;i++){
            if(str.equals(chnNameValue[i].name)){
                return i;
            }
        }
        return -1;
    }

    /**
     * 返回中文数字字符串所对应的int类型的阿拉伯数字
     * @param str
     * @return
     */
    public static int ChnStringToNumber(String str){
        int returnNumber=0;
        int section=0;
        int pos=0;
        int number=0;
        while (pos<str.length()){
            int num=ChnNumToValue(str.substring(pos,pos+1));
            //若num>=0,代表该位置(pos),所对应的是数字不是权位。若小于0,则表示为权位
            if(num>=0){
                number=num;
                pos++;
                //pos是最好一位,直接将number加入到section中。
                if(pos>=str.length()){
                    section+=number;
                    returnNumber+=section;
                    break;
                }
            }else{
                int chnNameValueIndex=ChnUnitToValue(str.substring(pos,pos+1));
                //chnNameValue[chnNameValueIndex].secUnit==true,表示该位置所对应的权位是节权位,
                if(chnNameValue[chnNameValueIndex].secUnit){
                    section=(section+number)*chnNameValue[chnNameValueIndex].value;
                    returnNumber+=section;
                    section=0;
                }else{
                    section+=number*chnNameValue[chnNameValueIndex].value;
                }
                pos++;
                number=0;
                if(pos>=str.length()){
                    returnNumber+=section;
                    break;
                }
            }
        }
        return returnNumber;
    }

    /**
     * 完成对中文数字字符串转换成阿拉伯数字函数的测试
     */
    public static void TestChnStringToNumber(){
        for(int i=0;i<testData.length;i++){
            int number=ChnStringToNumber(testData[i].chnNum);
            System.out.println(testData[i].chnNum+"\t"+number+"\t"+testData[i].number+"\t"+(number==testData[i].number));

        }
    }

    public static void main(String[] args) {
        TestNumToChn();
        System.out.println("--------------------------------------------------------");
        TestChnStringToNumber();
    }
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cht_LOV_yl/article/details/52884684

智能推荐

connect to server ip fail java.net.SocketTimeoutException: connect timed out_failed to connect to server connection timed out-程序员宅基地

文章浏览阅读725次。这个问题是在使用junit测试时出现的,就是需要关闭centos7的防火墙systemctl stop firewalld.service@SpringBootTest@RunWith(SpringRunner.class)public class TestFastDFS { //测试上传 @Test public void testUpdate() { ..._failed to connect to server connection timed out

java怎么创建局部变量_Java使用getter in for循环或创建一个局部变量?-程序员宅基地

文章浏览阅读250次。作为Rogério answered,在循环之外获取对象引用(Object object = example.getValue();)可能比在循环中调用getter更快(或至少不会更慢),因为在“最糟糕”的情况下,example.getValue()可能会在背景中做一些非常计算上昂贵的东西,尽管getter methods应该是“微不足道的”.通过分配引用一次并重新使用它,您只需执行一次昂贵的计算..._创建一个带局部变量的function java

java饮料_品尝饮料java代码-程序员宅基地

文章浏览阅读1.9k次。题目:品尝饮料时间:2018-1-5一、要求1、使用命令行参数(饮料类型),输出该饮料类型的味道,如:当命令行参数为1时,结果见如下:咖啡:苦2、如果没有该种饮料,结果见如下:对不起!没有您输入的饮料类型。二、推荐实现步骤1、建立一个Java抽象类Drink,应当:a、声明一个抽象方法taste(),该方法负责输出饮料的味道;b、声明int型常量来代表不同的饮料类型(咖啡、啤酒、牛奶),如:1:咖..._三、品尝饮料 1.建立一个抽象类drink,应当: (1)声明一个抽象方法taste(),该方法负

android 弹出输入框 输入法,(转)android开发-输入法弹出遮挡编辑框问题-程序员宅基地

文章浏览阅读618次。当我们做一个发送消息布局的时候,编辑框往往是在下面,而输入法弹出的时候就会吧编辑框完全遮挡,导致看不见输入框,这样用户体验就会很差!下面9种设置,可能会解决你在输入法上碰到的一些问题android:windowSoftInputMode=“adjustPan” 在Manifest.xml 属性一共有9个取值,分别是:stateUnspecified,stateUnchanged,stateHi..._stateunchanged

计算机描述不可用win10,升级win10出现的各种问题及解决办法-程序员宅基地

文章浏览阅读2.5k次。将电脑从以前版本的 Windows-如 Windows 7 或 Windows 8.1-升级到 Windows 10。本常见问题解答旨在解决有关升级到 Windows 10 的问题。本文将针对Win10的一些常见问题给出解决方案,如果你在使用Win10的过程中,遇到了无限重启、不能使用打印机和无法与Windows XP直接共享等问题,那这篇文章可能对你有帮助。升级win10出现的各种问题汇..._win10有问题

linux两个终端间通信,不同vlan间的通信简单配置(三种方式)-程序员宅基地

文章浏览阅读1k次。不同vlan间的通信简单配置1.单臂路由(图)环境:一台路由器,一台二层交换机,两台pc机二层交换机的配置一般模式:Switch>输入enable进入特权模式:Switch>enable输入configure terminal进入全局配置模式:Switch#configure terminalEnter configuration commands, one per line. En..._配置vlan使两台linux服务器互通

随便推点

android 编译完后镜像在哪个文件夹,android 镜像文件打包和解压-程序员宅基地

文章浏览阅读672次。android 源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的 文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator负责加载这3个映像文件后,会 把system.img和userdata.img分别加载到 ramdisk文件系统中的sys..._android rootdir 编译到哪个镜像里

在VS2013下运行VS2010的项目 错误:Building an MFC project for a non-Unicode character set is deprecated_vs的unicode错误-程序员宅基地

文章浏览阅读267次。当使用VS2013运行VS2010项目的时候,会提示升级VC++,点击确定但是运行调试的时候,还是会出错,找不到mfc100d.dll,msvcr100d.dll上网搜索,找办法安装XXX库之后,依旧不行**错误:**Building an MFC project for a non-Unicode character set is deprecated解决办法:微软解释用于多字节..._vs的unicode错误

automake生成静态库文件_visual studio lib和dll的编译生成与调用-程序员宅基地

文章浏览阅读142次。Dll在Windows下,DLL(Dynamic Link Library,动态链接库)是一个被编译过的二进制程序,但与.exe文件不同,.dll文件不能独立运行,必须由其他程序调用。为什么有这东西呢?当然有其存在的好处啦:不限语言。我们可以用自己熟悉的语言写DLL,然后由其他语言写的可执行程序来调用这些DLL。例如,可以用Python写程序的主界面,然后调用C写的实现一个具体功能的DLL模块。增..._automake,vs

python+selenium自动化软件测试(unittes)-程序员宅基地

文章浏览阅读5.1k次。1.1 unittest简介前言(python基础比较弱的,建议大家多花点时间把基础语法学好,这里有套视频,可以照着练习下:http://pan.baidu.com/s/1i44jZdb密码:92fs)熟悉java的应该都清楚常见的单元测试框架Junit和TestNG,这个招聘的需求上也是经常见到的。python里面也有单元测试框架-unittest,相当于是一个python版的junit。..._python+selenium+unittes分层

PSIM软件学习---01初识别PSIM软件-程序员宅基地

文章浏览阅读1w次,点赞14次,收藏70次。  PSIM是趋向于电力电子领域以及电机控制领域的仿真应用包软件。PSIM全称Power Simulation。PSIM是由SIMCAD 和SIMVIEM两个软件来组成的。  PSIM软件最大的特点是支持C语言模块,这样在仿真电路时,特别是数字电源或者电机驱动仿真时,可以直接编写C代码来驱动功率管,调试电路非常方便。  但是PSIM仿真软件在网上的教程比较少,学习起来比较困难,当时自己学习的时候也废了好大的功夫,于是决定写一个系列的文章,来比较全面的介绍一下PSIM软件的使用。由于自己也是刚学会不久,如_psim

odoo tree视图属性_"odoo editable=\"top"-程序员宅基地

文章浏览阅读238次。一般属性列表颜色常用判断格式:编辑属性 editableeditable=“bottom”是在行的底部创建2.editable=“top”是在行的顶部创建_"odoo editable=\"top"

推荐文章

热门文章

相关标签