2007年11月14日 星期三

中文大寫金額轉換函式

這個FUNCTION 是為了朋友寫的,其中大部分是參考某網友寫的程式(不好意思,忘了網址),有需要的朋友可以參考看看。

CREATE OR REPLACE FUNCTION get_ntd_amt(smallmoney VARCHAR2)
RETURN VARCHAR2 IS
   BigWrite       VARCHAR2(100); --用於返回大寫的金額
   Bignum         VARCHAR2(10); --用於存放每一個阿拉伯數字對應的漢字
   NTD            VARCHAR2(10); --用於存放台幣單位
   moneyplace     NUMBER; --用於確定台幣的精度,最多只能精確到分
   dotplace       NUMBER; --確定小數點的位置
   moneynum       NUMBER; --台幣的位數
   err_exception  EXCEPTION;
BEGIN
   /*用內置函數INSTR確定小數點的位置*/
   dotplace:= INSTR(smallmoney,'.');
   /*判斷是否超出本函數定義的精度範圍,
   如果是則引發自定義異常err_exception*/
   IF (LENGTH(smallmoney)>14)
      OR((LENGTH(smallmoney)>12)AND(dotplace=0)) THEN
      RAISE err_exception;
   END IF;
   /*確定台幣的精度,如果小數點位置為0則精度只精確到元否則按小數點的 位置來確定台幣的精度*/
   IF dotplace=0 THEN
      moneyplace:=0;
   ELSE
      moneyplace:=dotplace-LENGTH(smallmoney);
   END IF;
   /*確定台幣的精確,如果小數點位置為0則精度只精確到元否則按小數點的 位置來確定台幣的精度*/

   /*通過一個FOR循環將smallmoney中的阿拉伯數字逐一去出來,注意該FOR循 環是按照降序循環的*/
   BigWrite :='';
   FOR moneynum in REVERSE 1..LENGTH(smallmoney) LOOP
       /*如果位置在小數點的位置則不做任何動作*/
       IF moneynum<>dotplace THEN
          /*CASE循環將smallmoney裡對應的阿拉伯數字用中文來表示*/
          Bignum := CASE SUBSTR(smallmoney,moneynum,1)
                    WHEN '1' THEN '壹'
                    WHEN '2' THEN '貳'
                    WHEN '3' THEN '參'
                    WHEN '4' THEN '肆'
                    WHEN '5' THEN '伍'
                    WHEN '6' THEN '陸'
                    WHEN '7' THEN '柒'
                    WHEN '8' THEN '捌'
                    WHEN '9' THEN '玖'
                    WHEN '0' THEN '零'
                    END;     
          /*CASE循環來設置smallmoney裡對應的阿拉伯數字的相應的精度*/
          NTD := CASE moneyplace
                 WHEN -2 THEN '分'
                 WHEN -1 THEN '角'
                 WHEN 0  THEN '元'
                 WHEN 1  THEN '拾'
                 WHEN 2  THEN '佰'
                 WHEN 3  THEN '仟'
                 WHEN 4  THEN '萬'
                 WHEN 5  THEN '拾'
                 WHEN 6  THEN '佰'
                 WHEN 7  THEN '仟'
                 WHEN 8  THEN '億'
                 WHEN 9  THEN '拾'
                 WHEN 10 THEN '佰'
                 WHEN 11 THEN '仟'
                 END;
          moneyplace := moneyplace+1;
          --IF BigWrite IS NULL THEN
          --BigWrite := Bignum||NTD;
          --ELSE
          BigWrite := Bignum||NTD||BigWrite;
          --END IF;
       END IF;
   END LOOP;
   RETURN BigWrite;
EXCEPTION --異常處理部分
   WHEN err_exception THEN
        return ('該函數只能轉換長度不大於14位後整數位不大於12位的金額!');
   WHEN OTHERS THEN
        return ('不是有效的金額!');
END;

沒有留言: