CREATE OR REPLACE FUNCTION FUN_MONEY_RMB(P_MONEY IN VARCHAR2)
RETURN VARCHAR2 IS
-- Author : Wang'Guanghui
-- Created : 2008-2-20 13:12:12
-- PURPOSE :返回人民币大写方式
NUM NUMBER;
I NUMBER;
J NUMBER;
K NUMBER;
L NUMBER;
FS1 VARCHAR2(20);
FS2 VARCHAR2(20);
FS3 VARCHAR2(30);
S VARCHAR2(40);
S1 VARCHAR2(40);
S2 VARCHAR2(100);
ZERO NUMBER;
POS NUMBER;
H NUMBER;
T NUMBER(5, 4);
BEGIN
IF NVL(P_MONEY, 0) = 0 OR INSTR(P_MONEY,'.')>=18 THEN
RETURN '无';
END IF;
ZERO := 0;
POS := 0;
FS1 := '零壹贰叁肆伍陆柒捌玖';
FS2 := '仟佰拾万仟佰拾元';
FS3 := '仟佰拾万仟佰拾亿';
H := TRUNC(P_MONEY); ---整数部分
T := P_MONEY - H; ---小数部分
IF T = 0 THEN
---形成字符串
S := LPAD(TO_CHAR(H), 16, '0') || '.0000';
ELSE
S := LPAD(TO_CHAR(H), 16, '0') || RPAD(TO_CHAR(T), 5, '0');
END IF;
S1 := SUBSTR(S,1,8)||'.';
--整理亿位数字
FOR I IN 1 .. 8 LOOP
IF I >= POS THEN
--- else skip 0
L := TO_NUMBER(SUBSTR(S1, I, 1));
IF L > 0 THEN
--add fs1 and fs2 char
S2 := S2 || SUBSTR(FS1, L + 1, 1) || SUBSTR(FS3, I, 1);
ZERO := 1; --有整数
ELSE
IF I = 4 THEN
S2 := S2 || '万';
END IF; ---插入万字,因为从此出分隔一次循环
POS := I + 1;
FOR J IN I + 1 .. 9 LOOP
IF SUBSTR(S1, J, 1) = '0' THEN
POS := POS + 1;
END IF;
EXIT WHEN SUBSTR(S1, J, 1) != '0';--POS >= 9;
END LOOP;
IF POS = 9 AND SUBSTR(S1,1,8) >= 1 THEN
S2 := S2 || '亿'; --无个亿位,直接加亿
ELSE
IF ZERO = 1 THEN
S2 := S2 || '零';
END IF; --不到个亿位,补中间零 eg 10101
END IF;
END IF;
END IF;
END LOOP;
ZERO := 0;
POS := 0;
--整理亿位之后的数据
S1 := SUBSTR(S,9);
FOR I IN 1 .. 8 LOOP
IF I=1 AND TO_NUMBER(SUBSTR(S1, I, 1)) =0 AND S2 IS NOT NULL THEN
S2 := S2 || '零';
END IF;
IF I >= POS THEN
--- else skip 0
L := TO_NUMBER(SUBSTR(S1, I, 1));
IF L > 0 THEN
--add fs1 and fs2 char
S2 := S2 || SUBSTR(FS1, L + 1, 1) || SUBSTR(FS2, I, 1);
ZERO := 1; --有整数
ELSE
IF I = 4 THEN
S2 := S2 || '万';
END IF; ---插入万字,因为从此出分隔一次循环
POS := I + 1;
FOR J IN I + 1 .. 9 LOOP
IF SUBSTR(S1, J, 1) = '0' THEN
POS := POS + 1;
END IF;
EXIT WHEN SUBSTR(S1, J, 1) != '0';
END LOOP;
IF POS = 9 AND P_MONEY >= 1 THEN
S2 := S2 || '元'; --无个位,直接加元
ELSE
IF ZERO = 1 THEN
S2 := S2 || '零';
END IF; --不到个位,补中间零 eg 10101.00
END IF;
END IF;
END IF;
END LOOP;
IF SUBSTR(S1, 10, 4) = '0000' THEN
S2 := S2 || '整';
ELSE
L := TO_NUMBER(SUBSTR(S1, 10, 1));
IF L > 0 THEN
S2 := S2 || SUBSTR(FS1, L * 1 + 1, 1) || '角';
ELSE
IF P_MONEY > 0.1 THEN
S2 := S2 || '零';
END IF; --去掉0.01的前导零
END IF;
L := TO_NUMBER(SUBSTR(S1, 11, 1));
IF L > 0 THEN
S2 := S2 || SUBSTR(FS1, L * 1 + 1, 1) || '分';
END IF;
END IF;
RETURN S2;
END FUN_MONEY_RMB;