create or replace function trans_amount1(ip_number number) return VARCHAR2 is
NEG VARCHAR2(100);
Z Varchar2(2);
L_IP Number;
L_ZeroFlag Integer:=1;
BEGIN
NEG:=Case When Ip_Number<=0 Then '负' When IP_Number=0 Then '零' End ;
L_IP:=ABS(IP_Number);
If NEG Is Null Then
For i in 1..Length(L_IP)
Loop
Z:=SubStr(L_IP,i,1);
If Z='0' then
NEG:=NEG||'零';
ElsIf Z='.' then
If i=1 Then
NEG:='零';
End If;
NEG:=NEG||'点';
L_ZeroFlag:=0;
Else
NEG:=NEG||SUBSTR('壹贰叁肆伍陆柒捌玖',To_Number(Z), 1);
If L_ZeroFlag=1 Then
If Instr(L_IP,'.')-i-1<>0 Then
NEG:=NEG||SUBSTR('拾佰仟万亿拾佰仟万', Instr(L_IP,'.')-i-1, 1);
End if;
End If;
End If;
End Loop;
End if;
Return NEG||' 吨';
END trans_amount1;我现在有个数字转变大写的函数出现了点问题,我解决不了了!
现在的问题是 整数和小数点前一位是零的有问题,例如:1. 11吨翻译 后为壹仟壹佰 吨
2. 10.289吨翻译 后为壹拾零点贰捌玖 吨
NEG VARCHAR2(100);
Z Varchar2(2);
L_IP Number;
L_ZeroFlag Integer:=1;
BEGIN
NEG:=Case When Ip_Number<=0 Then '负' When IP_Number=0 Then '零' End ;
L_IP:=ABS(IP_Number);
If NEG Is Null Then
For i in 1..Length(L_IP)
Loop
Z:=SubStr(L_IP,i,1);
If Z='0' then
NEG:=NEG||'零';
ElsIf Z='.' then
If i=1 Then
NEG:='零';
End If;
NEG:=NEG||'点';
L_ZeroFlag:=0;
Else
NEG:=NEG||SUBSTR('壹贰叁肆伍陆柒捌玖',To_Number(Z), 1);
If L_ZeroFlag=1 Then
If Instr(L_IP,'.')-i-1<>0 Then
NEG:=NEG||SUBSTR('拾佰仟万亿拾佰仟万', Instr(L_IP,'.')-i-1, 1);
End if;
End If;
End If;
End Loop;
End if;
Return NEG||' 吨';
END trans_amount1;我现在有个数字转变大写的函数出现了点问题,我解决不了了!
现在的问题是 整数和小数点前一位是零的有问题,例如:1. 11吨翻译 后为壹仟壹佰 吨
2. 10.289吨翻译 后为壹拾零点贰捌玖 吨
解决方案 »
- winXp系统上装了两个oracle客户端:oracle10g、oracle92 如何将oracle92配置为默认的客户端
- 使用level=0的基础备份后不能恢复,提示数据文件是从老备份里恢复的,请各位帮忙看看
- 用spool,如何在存储过程执行过程中输出信息?
- 紧急求助:本人给一个公司做了个网站,用JSP ORACLE SERVERLET 技术,但做完后发现网上没有可以支持上传的空间,几
- oracle8i安装的问题
- 一个关于to_char和to_date的问题
- 急!!ORACLE中在用户A的表空间下建立一个视图,该视图映射到B的表空间下的表,建立不成功报错权限不足。
- 请教oracle数据库update语句
- 请教:如何用dbms_job包的submit()让一段PL/SQL代码定时执行?(跟者有分)
- oracle7 8的连接问题
- oracle9i登陆问题
- 日志如何还原某个时间点的数据库
If Instr(L_IP,'.')-i-1 <>0 Then
NEG:=NEG ¦ ¦SUBSTR('拾佰仟万亿拾佰仟万', Instr(L_IP,'.')-i-1, 1);
End if; 这里,整数是没有'.'的,所以,Instr(L_IP,'.')-i-1
算出来是负数,因此substr时负数表示从末尾开始数,然后
截取
NEG VARCHAR2(100);
Z VARCHAR2(100);
L_IP Number;
INSTR_LENGTH NUMBER ;
AD VARCHAR2(100);--小數點后
BC NUMBER;--小數點前
BEGIN
L_IP:=ABS(IP_Number);
INSTR_LENGTH := INSTR(L_IP,'.');--只有小數時
IF INSTR_LENGTH = 1 THEN
NEG := '零点';
For i in 2..Length(L_IP) Loop
Z:=SUBSTR(L_IP,I,1);
IF Z = '0' THEN
NEG := NEG||'零';
ELSE
NEG := NEG||SUBSTR('一二三四五六七八九',TO_NUMBER(Z),1);
END IF;
END LOOP;
--整數時
ELSIF INSTR_LENGTH = 0 THEN
For i in 1..Length(L_IP) Loop
Z:=SUBSTR(L_IP,I,1);
IF Z <> '0' THEN
NEG := NEG || SUBSTR('一二三四五六七八九',TO_NUMBER(Z),1)||SUBSTR('$十百千万十百千意十百千',Length(L_IP)-I+1,1);
ELSE
IF I <> Length(L_IP) THEN
NEG := NEG || '零';
END IF;
END IF;
END LOOP;
ELSE
BC := TO_NUMBER(SUBSTR(L_IP,1,INSTR_LENGTH-1));
AD := (SUBSTR(TO_CHAR(L_IP),INSTR_LENGTH+1,Length(L_IP)-INSTR_LENGTH));
For i in 1..Length(BC) Loop
Z:=SUBSTR(BC,I,1);
IF Z <> '0' THEN
NEG := NEG || SUBSTR('一二三四五六七八九',TO_NUMBER(Z),1)||SUBSTR('$十百千万十百千意十百千',Length(BC)-I+1,1);
ELSE
IF I <> Length(BC) THEN
NEG := NEG || '零';
END IF;
END IF;
END LOOP;
NEG := NEG || '点';
For i in 1..Length(AD) Loop
Z:=SUBSTR(AD,I,1);
IF Z = '0' THEN
NEG := NEG||'零';
ELSE
NEG := NEG||SUBSTR('一二三四五六七八九',TO_NUMBER(Z),1);
END IF;
END LOOP;
END IF;
NEG := REPLACE(REPLACE(SUBSTR(NEG,1,INSTR(NEG,'点')),'零零','零'),'$','')
||SUBSTR(NEG,INSTR(NEG,'点')+1,LENGTH(NEG)-INSTR(NEG,'点'))||' TON';
IF SUBSTR(NEG,2,1) = '十' AND SUBSTR(NEG,1,1) = '一' THEN
NEG := SUBSTR(NEG,2,LENGTH(NEG));
END IF;
IF SUBSTR(NEG,INSTR(NEG,'点')-1,1)='零' THEN
NEG := SUBSTR(NEG,1,INSTR(NEG,'点')-2)||SUBSTR(NEG,INSTR(NEG,'点'),LENGTH(NEG)-INSTR(NEG,'点')+1);
END IF;
RETURN (NEG);
END NUM_UPPER;SQL> set serveroutput on
SQL> declare
2 a varchar2(100);
3 begin
4 a := NUM_UPPER(999912345600.01230456);
5 dbms_output.put_line(a);
6 end;
7 /
九千九百九十九意一千二百三十四万五千六百点零一二三零四五六 TON