2

I have a requirement in db.

1).Table ABC, column: check_amount number number(18,4). This basically contains check amount for eg. 3000.50 to be paid to an employee.

Now a cheque is issued and that check contains this check_amount in number as well as in text form.for eg.check will have:

pay to <emplyee_name> ****$3000.50**** ****THREE THOUSAND DOLLARS AND FIFTY CENTS****

I have to generate this text using DB column value and display that on check.

Can anybody help me out, how can i achieve this in oracle 11g ?

Hint:I have heard of Julien format, but that is not working. Any suggestions is greatly appreciated.

From Nalin

4

2 回答 2

2

由于 Julian 格式仅适用于整数,因此您可以分隔小数部分,然后将 Julian 格式技巧应用于分隔的数字。这是一个简单的演示。

DECLARE
   x   NUMBER (8, 2) := 1253.5;
   y   NUMBER;
   z   NUMBER;
BEGIN
   y := FLOOR (x);
   z := 100 * (x - y);
   DBMS_OUTPUT.put_line (TO_CHAR (TO_DATE (y, 'j'), 'jsp'));

   IF (z > 0)
   THEN
      DBMS_OUTPUT.put_line (TO_CHAR (TO_DATE (z, 'j'), 'jsp'));
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('err:' || SQLERRM);
END;
于 2013-05-13T05:44:02.240 回答
1

使用时有限制Julian dates,范围从1 to 5373484. 这就是为什么如果你把值放在 之后5373484,它会抛出一个错误,如下所示:

ORA-01854: julian date must be between 1 and 5373484

为了解决上述问题,创建一个函数,并使用 j->jsp 的小技巧,您可以获取所需的结果。

CREATE OR REPLACE FUNCTION spell_number (p_number IN NUMBER)
   RETURN VARCHAR2
AS
   TYPE myArray IS TABLE OF VARCHAR2 (255);
   v_decimal     PLS_INTEGER;

   l_str myArray
     := myArray ('',
                 ' thousand ',
                 ' million ',
                 ' billion ',
                 ' trillion ',
                 ' quadrillion ',
                 ' quintillion ',
                 ' sextillion ',
                 ' septillion ',
                 ' octillion ',
                 ' nonillion ',
                 ' decillion ',
                 ' undecillion ',
                 ' duodecillion ');

   l_num      VARCHAR2 (50) DEFAULT TRUNC (p_number);
   l_return   VARCHAR2 (4000);
BEGIN
  FOR i IN 1 .. l_str.COUNT
   LOOP
     EXIT WHEN l_num IS NULL;

      IF (SUBSTR (l_num, LENGTH (l_num) - 2, 3) <> 0)
      THEN
         l_return :=
            TO_CHAR (TO_DATE (SUBSTR (l_num, LENGTH (l_num) - 2, 3), 'J'),
                     'Jsp')
             || l_str (i)
             || l_return;
      END IF;

     l_num := SUBSTR (l_num, 1, LENGTH (l_num) - 3);
   END LOOP;

   v_decimal := 100* (p_number -TRUNC(p_number)) ;

   IF v_decimal>0 THEN 

       RETURN l_return ||' Dollars AND '||TO_CHAR (TO_DATE (v_decimal, 'j'), 'jsp')|| ' Cents';        


  ELSE

   RETURN l_return ||' Dollars' ;
  END IF;

END;
/

select  spell_number(122344343444444.23) from dual;

输出:

一百二十二万亿三四十四亿三四千三百万四十四万四十四美元和二十三美分博客链接

于 2013-05-13T10:13:23.690 回答