<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評(píng)論-50  文章-2  trackbacks-0

    摘要:以中文的形式表示數(shù)字,在開具發(fā)票、收據(jù)的時(shí)候經(jīng)常用到,尤其在金融領(lǐng)域。但數(shù)字的中文表示和其它語言有很大的不同,如中文以每4個(gè)數(shù)字(萬)為一個(gè)小的分隔。 本文以測試驅(qū)動(dòng)開發(fā)的方法,開發(fā)該功能。本程序只是用表示整數(shù)的中文形式,很容易擴(kuò)展到long形式和表示人民幣貨幣的表示形式。


    作者:Jeff 發(fā)表于:2006-12-02 08:12 最后更新于: 2007年12月21日 23:10
    版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本版權(quán)聲明
    http://m.tkk7.com/jeff-lau/archive/2007/12/21/169466.html


    /**
      * @author Jeff
      *
      * Copyright (c) 復(fù)制或轉(zhuǎn)載本文,請(qǐng)保留該注釋。
      */
    package chinese.utility.test;

    import org.junit.Assert;
    import org.junit.Test;

    import chinese.utility.ChineseNumber;

    public class ChinesNumberFormatter {

        /**
         * 單個(gè)數(shù)字 0--9
         */
        @Test
        public void testSingleLower() {
            Assert.assertEquals("零", new ChineseNumber(0).lower());
            Assert.assertEquals("五", new ChineseNumber(5).lower());
        }
        /**
         * 10--99
         */
        @Test
        public void test2BitLower() {
            Assert.assertEquals("六十八", new ChineseNumber(68).lower());
            Assert.assertEquals("八十", new ChineseNumber(80).lower());
        }

        /**
         * 100--999
         */
        @Test
        public void test3BitLower() {
            Assert.assertEquals("五百零八", new ChineseNumber(508).lower());
            Assert.assertEquals("八百", new ChineseNumber(800).lower());       
        }

        /**
         * 1000--9999
         */
        @Test
        public void test4BitLower() {
            Assert.assertEquals("一千零八", new ChineseNumber(1008).lower());
            Assert.assertEquals("一千零八十", new ChineseNumber(1080).lower());

        }
        /**
         * > 9999
         */
        @Test
        public void test5BitLower() {
            Assert.assertEquals("三十萬零八千", new ChineseNumber(308000).lower());
            Assert.assertEquals("三十萬零八百", new ChineseNumber(300800).lower());
        }
        /**
         * 縮寫和大寫一起測
         */
        @Test
        public void testAbbriation() {
            Assert.assertEquals("拾捌", new ChineseNumber(18, true).upper());
        }

    }

    測試

    /**
      * @author Jeff
      *
      * Copyright (c) 復(fù)制或轉(zhuǎn)載本文,請(qǐng)保留該注釋。
      */
    package chinese.utility;

    public class ChineseNumber {

        private static final int RADIX = 10;

        private static final String[] LOWER_UNIT = { "", "十", "百", "千", "萬", "十",
                "百", "千", "億", "十", "百", "千", "萬", "十", "百", "千", "萬" };
        private String[] LOWER = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };

        private static final String[] UPPER_UNIT = { "", "拾", "佰", "仟", "萬", "拾",
                "佰", "仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "萬" };
        private String[] UPPER = { "零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖" };

        private int number;
        private boolean abbreviation;

        public ChineseNumber(int number, boolean isShort) {
            this.number = number;
            this.abbreviation = isShort;
        }

        public ChineseNumber(int number) {
            this(number, false);
        }

        public String lower() {
            return format(LOWER, LOWER_UNIT);
        }
        public String upper() {   
            return format(UPPER, UPPER_UNIT);
        }
        private String format(final String[] chinese, final String[] unit) {
            if (number == 0) {
                return chinese[number];
            }

            if (abbreviation == true && canAbbreviate(number)) {
                return formatShort(chinese, unit);
            }
            String result = "";

            int leftNumber = number;
            int rightNumber = 0;
            int currentNumber = 0;
            int bit = 0;
            while (leftNumber > 0) {
                rightNumber = currentNumber;
                currentNumber = leftNumber % RADIX;
                leftNumber = leftNumber / RADIX;

                if (currentNumber > 0) {
                    result = chinese[currentNumber] + unit[bit] + result;
                } else if (rightNumber > 0) {
                    result = chinese[currentNumber] + result;
                }

                if (bit % 4 == 0 && currentNumber == 0) {
                    result = unit[bit] + result;
                }

                bit++;
            }

            return result;

        }

        /**
         * 縮寫 18 為 十八 或 拾捌
         */
        private String formatShort(String[] chinese, String[] unit) {       
            return unit[1] + chinese[number % RADIX];
        }

        /**
         * 能否縮寫
         */
        private boolean canAbbreviate(int number2) {
            if (number2 >= 9 && number2 <= 19) {
                return true;
            }
            return false;
        }

    }

    posted on 2007-12-21 23:09 Jeff Lau 閱讀(1866) 評(píng)論(2)  編輯  收藏 所屬分類: 跟老劉學(xué)Java

    評(píng)論:
    # re: 中文數(shù)字 2007-12-22 20:30 | Jeff Lau
    各位,有意見,不管表揚(yáng)的、批評(píng)的都可以提提。有問題也可以提。我虛心以待。  回復(fù)  更多評(píng)論
      
    # re: 中文數(shù)字 2008-03-23 01:12 | dfdf
    主站蜘蛛池模板: 日韩午夜免费视频| 国产在线观看片a免费观看| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 黄网站色视频免费看无下截| 免费无码黄动漫在线观看| 亚洲人成人伊人成综合网无码| 国产成人免费网站| 亚洲色少妇熟女11p| 日韩精品免费一区二区三区| 亚洲码和欧洲码一码二码三码| 成全视频免费高清| 国产精品亚洲lv粉色| 亚洲国产成人精品女人久久久 | 免费阿v网站在线观看g| 亚洲最大成人网色香蕉| 永久免费AV无码网站在线观看 | 四虎影视久久久免费观看| 中文字幕在线亚洲精品| 久章草在线精品视频免费观看| 久久亚洲精品国产精品| 最近2019中文字幕免费看最新| 婷婷国产偷v国产偷v亚洲| 亚洲一区二区三区国产精品| 人妻免费一区二区三区最新| 亚洲短视频在线观看| 日韩成人免费在线| 精品97国产免费人成视频| 亚洲一区综合在线播放| 女人被免费视频网站| 国产久爱免费精品视频 | 2021精品国产品免费观看 | 亚洲精品第一国产综合亚AV| 免费大片黄手机在线观看| 三年片在线观看免费西瓜视频| 亚洲一区二区三区无码国产| 国产一区二区三区无码免费| 久久香蕉国产线看免费| 亚洲熟女乱色一区二区三区| 久久久久久a亚洲欧洲aⅴ| 在线免费一区二区| 免费在线看黄的网站|