隨筆-16  評論-50  文章-2  trackbacks-0

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


          作者:Jeff 發表于:2006-12-02 08:12 最后更新于: 2007年12月21日 23:10
          版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本版權聲明
          http://www.aygfsteel.com/jeff-lau/archive/2007/12/21/169466.html


          /**
            * @author Jeff
            *
            * Copyright (c) 復制或轉載本文,請保留該注釋。
            */
          package chinese.utility.test;

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

          import chinese.utility.ChineseNumber;

          public class ChinesNumberFormatter {

              /**
               * 單個數字 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) 復制或轉載本文,請保留該注釋。
            */
          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 閱讀(1870) 評論(2)  編輯  收藏 所屬分類: 跟老劉學Java

          評論:
          # re: 中文數字 2007-12-22 20:30 | Jeff Lau
          各位,有意見,不管表揚的、批評的都可以提提。有問題也可以提。我虛心以待。  回復  更多評論
            
          # re: 中文數字 2008-03-23 01:12 | dfdf
          恏  回復  更多評論
            
          主站蜘蛛池模板: 宁波市| 庐江县| 牟定县| 庆元县| 乳源| 休宁县| 平阴县| 大竹县| 通辽市| 古田县| 垦利县| 高平市| 绥芬河市| 平和县| 阿拉善盟| 彩票| 京山县| 班玛县| 荔波县| 石楼县| 新津县| 辽阳县| 南岸区| 安康市| 四子王旗| 新平| 建瓯市| 永州市| 靖远县| 抚顺县| 崇明县| 崇左市| 仪陇县| 崇州市| 大新县| 沁阳市| 宁安市| 杭锦后旗| 诸暨市| 屏东市| 阳西县|