function fn_getupperrmb(money IN number)
return varchar2 is
TYPE MAPPING IS TABLE OF VARCHAR2(6) INDEX BY BINARY_INTEGER;
UPPERDW MAPPING;
DW MAPPING;
STRYUAN VARCHAR2(100);
STRFEN VARCHAR2(100);
STR_RES VARCHAR2(100);
LENYUAN NUMBER;
J NUMBER;
WS NUMBER;--位数
SZ VARCHAR2(3);--数字
YUAN_RES VARCHAR2(100);
FEN_RES VARCHAR2(100);
begin
If money Is Null Then
Return Null;
End If;
UPPERDW(0) := '零';
UPPERDW(1) := '壹';
UPPERDW(2) := '贰';
UPPERDW(3) := '叁';
UPPERDW(4) := '肆';
UPPERDW(5) := '伍';
UPPERDW(6) := '陆';
UPPERDW(7) := '柒';
UPPERDW(8) := '捌';
UPPERDW(9) := '玖';
DW(-2) := '分';
DW(-1) := '角';
DW(1) := '';
DW(2) := '拾';
DW(3) := '佰';
DW(4) := '仟';
DW(5) := '万';
DW(6) := '拾';
DW(7) := '佰';
DW(8) := '仟';
DW(9) := '亿';
STRYUAN :=TO_CHAR(FLOOR(MONEY));
IF STRYUAN = '0'
THEN
LENYUAN :=0;
STRFEN :=LPAD(TO_CHAR(FLOOR(MONEY*100)),2,'0');
ELSE
LENYUAN :=LENGTH(STRYUAN);
STRFEN :=TO_CHAR(FLOOR(MONEY*100));
END IF;
If STRFEN = '00' Then
STR_RES := '零圆整';
return STR_RES;
End If;
-----处理整数
FOR I IN 1..LENYUAN
LOOP
J :=LENYUAN - I + 1;
SZ :=SUBSTR(STRYUAN,J,1);
WS:=MOD(I,8);
IF WS =1 AND I>1
THEN YUAN_RES:=DW(9)||YUAN_RES;
END IF;
IF WS = 0
THEN
WS :=8;
END IF;
IF SZ<>'0'
THEN
YUAN_RES := UPPERDW(SZ)||DW(WS)||YUAN_RES;
ELSE
IF WS = 5 or WS = 1 THEN
IF SUBSTR(STRYUAN,J-3,4) <> '0000'
THEN
YUAN_RES :=DW(WS)||YUAN_RES;
END IF;
ELSE
IF SUBSTR(STRYUAN,J+1,1) <> '0'
THEN
YUAN_RES :=UPPERDW(SZ)||YUAN_RES;
END IF;
END IF;
END IF;
END LOOP;
IF YUAN_RES IS NOT NULL
THEN
YUAN_RES:= YUAN_RES||'圆';
END IF;
---处理小数
FOR I IN 1..2
LOOP
SZ :=SUBSTR(STRFEN,LENGTH(STRFEN)-I+1,1);
IF SZ <> '0'
THEN
FEN_RES := UPPERDW(SZ)||DW(I-3)||FEN_RES;
END IF;
END LOOP;
IF FEN_RES IS NULL
THEN
YUAN_RES:= YUAN_RES||'整';
END IF;
IF SUBSTR(STRFEN,LENGTH(STRFEN),1) = '0'
THEN
FEN_RES:=FEN_RES||'整';
END IF;
STR_RES :=YUAN_RES || FEN_RES;
IF STR_RES IS NULL
THEN
STR_RES:= '零元整';
END IF;
return STR_RES;
end fn_getupperrmb;