ORACLE人民币大写(支持千万亿9999999999999999.999)

上一篇 / 下一篇  2008-02-22 16:13:27 / 天气: 晴朗 / 心情: 平静 / 个人分类:函数

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;


TAG: ora 大写人民币 千万亿

引用 删除 1   /   2008-07-10 13:43:08
试试 1000000.02
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-25  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 913
  • 日志数: 11
  • 书签数: 1
  • 建立时间: 2007-12-14
  • 更新时间: 2008-05-30

RSS订阅

Open Toolbar