此代码为网上转载而来,如有侵权之说请联系本人删除,谢谢!
CREATE OR REPLACE FUNCTION CONVERT_MONEY(INPUT_NBR IN NUMBER DEFAULT 0)
/*
函数名称: CONVERT_MONEY
用 于: 将以分为单位输入的数值转换为大写汉字形式
注 释: 当转换后的汉字以分结尾时,不加“整”,当以角或元结尾时加“整”,这符合银行的规定。
数字金额凡是中间出现0的,必须转为大写的“零”,连续多个0时只转为一个“零”字,
结尾出现0时要加“整”,结尾不是0时不加“整”,这与前面的规定是一致的。
由于圆是货币单位,所以在多于1元钱时,圆是必须出现的。但是,万佰等是数字单位,有
时可能不出现。
[php]
*/
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 * 1+ 1, 1));/*取出当前位的单位汉字*/
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 * 1 + 1, 1)||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;