⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convert_money.txt

📁 将以分为单位输入的数值转换为大写汉字形式
💻 TXT
字号:
CREATE OR REPLACE FUNCTION CONVERT_MONEY(INPUT_NBR IN NUMBER DEFAULT 0) 
/* 
函数名称: CONVERT_MONEY 
用 于: 将以分为单位输入的数值转换为大写汉字形式 
注 释: 当转换后的汉字以分结尾时,不加“整”,当以角或元结尾时加“整”,这符合银行的规定。 
数字金额凡是中间出现0的,必须转为大写的“零”,连续多个0时只转为一个“零”字, 
结尾出现0时要加“整”,结尾不是0时不加“整”,这与前面的规定是一致的。 
由于圆是货币单位,所以在多于1元钱时,圆是必须出现的。但是,万佰等是数字单位,有 
时可能不出现。 


代码:--------------------------------------------------------------------------------
*/
       RETURN VARCHAR2 IS
INPUT_NBR_BAK     NUMBER(20);      /*用于接收输入参数 INPUT_NBR */
NUM_CHARACTER     VARCHAR2(20) := '零壹贰叁肆伍陆柒捌玖';
UNIT_CHARACTER    VARCHAR2(40) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿';
OUTPUT_STRING     VARCHAR2(100):= '';
REMAIN_NBR        NUMBER(20);
BIT_NUM           NUMBER(20);      /*每一位上的数字*/
BIT_UNIT          VARCHAR2(2);     /*每一位所对的单位*/
BIT_INDIC         NUMBER(1) :=0;   /*每一位的数字是否为0,0表示为0,1表示不为0*/
I                 NUMBER(2) :=0;   /*循环次数,索引变量从0开始*/
SPE_UNIT          VARCHAR2(2):='A';/*特殊位,包括万和亿,表示该亿汉字是否已写入结果字串*/
SIGN_INDIC        VARCHAR2(1);     /*用于标志数值符号:0为正,1为负*/
BEGIN
IF     INPUT_NBR=0 THEN RETURN '零圆整';
ELSIF  INPUT_NBR>0 THEN SIGN_INDIC:='0';
       INPUT_NBR_BAK:=INPUT_NBR;
ELSIF  INPUT_NBR<0 THEN SIGN_INDIC:='1';
       INPUT_NBR_BAK:=-INPUT_NBR;
END    IF;
LOOP
    REMAIN_NBR     := FLOOR(INPUT_NBR_BAK / 10);          /*取出除后的商*/
    BIT_NUM        := INPUT_NBR_BAK - REMAIN_NBR * 10;    /*取出当前位的数值*/
    INPUT_NBR_BAK  := REMAIN_NBR;                         /*保存商以做下一次循环*/
    BIT_UNIT       := RTRIM(SUBSTR(UNIT_CHARACTER, I * 2+ 1, 2));/*取出当前位的单位汉字*/
   
    IF    BIT_NUM > 0 THEN                                /*当前位的值不为0*/
          BIT_INDIC :=1;
          IF    I=6  OR I=14  THEN                        /*当前位是'万'位或'万亿'位*/
                SPE_UNIT:='万';                           /*表示万已经写入OUTPUT_STRING中,在BIT_UNIT中会包含万字*/
          ELSIF (I>=7 AND I<=9) OR (I>=15 AND I<=17) THEN /*当前位在万及千万之间或万亿及千万亿之间*/
                IF   SPE_UNIT!='万' THEN                  /*万还没写入OUTPUT_STRING中,则要写入一次*/
                     OUTPUT_STRING:='万'||OUTPUT_STRING;
                     SPE_UNIT:='万';                      /*表示万已经写入OUTPUT_STRING中*/
                END  IF;
          END   IF;                                       /*高于千万亿的数本程序不考虑了*/
          OUTPUT_STRING := SUBSTR(NUM_CHARACTER, BIT_NUM * 2 + 1, 2)||BIT_UNIT||OUTPUT_STRING;
    ELSE                                                  /*当前位等于0时,走此分支*/
          IF   BIT_INDIC = 1 THEN             /*当前位的前一位不为0时写 零 */
               OUTPUT_STRING := '零'||OUTPUT_STRING;
          END  IF;
          IF    BIT_UNIT IN ('圆','亿') THEN  /*若已达圆位,则圆是必须出现的,由于亿太大,不与万相同处理,所以就与圆一样处理*/
                SPE_UNIT:=BIT_UNIT;           /*保存圆与亿,以与万相区别*/
                OUTPUT_STRING := BIT_UNIT||OUTPUT_STRING;
          END   IF;
          BIT_INDIC  :=0;                     /*当前位的值为0*/
    END   IF;
    I := I + 1;
    EXIT WHEN INPUT_NBR_BAK = 0;
END LOOP;

IF    MOD(INPUT_NBR,10)=0 THEN             /*输入的数字没有分,最小的是角,则尾部串个整*/
      OUTPUT_STRING:=OUTPUT_STRING||'整';
END   IF;
IF    SIGN_INDIC='1' THEN
      OUTPUT_STRING:='负'||OUTPUT_STRING;
END   IF;
RETURN OUTPUT_STRING;
END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -