Sunday, June 16, 2013

PLSQL FUNCTION script for converting rupees in words

Function Script:

CREATE OR REPLACE FUNCTION ruppee_to_word (amount IN NUMBER)
   RETURN VARCHAR2
AS
   v_length   INTEGER         := 0;
   v_num2     VARCHAR2 (50)   := NULL;
   v_amount   VARCHAR2 (50)   := TO_CHAR (TRUNC (amount));
   v_word     VARCHAR2 (4000) := NULL;
   v_word1    VARCHAR2 (4000) := NULL;

   TYPE myarray IS TABLE OF VARCHAR2 (255);

   v_str      myarray         := myarray (' Thousand ', ' Lakh ', ' Crore ');
BEGIN
   IF ((amount = 0) OR (amount IS NULL))
   THEN
      v_word := 'zero';
   ELSIF (TO_CHAR (amount) LIKE '%.%')
   THEN
      IF (SUBSTR (amount, INSTR (amount, '.') + 1) > 0)
      THEN
         v_num2 := SUBSTR (amount, INSTR (amount, '.') + 1);

         IF (LENGTH (v_num2) < 2)
         THEN
            v_num2 := v_num2 * 10;
         END IF;

         v_word1 :=
               ' AND '
            || (TO_CHAR (TO_DATE (SUBSTR (v_num2, LENGTH (v_num2) - 1, 2),
                                  'J'),
                         'JSP'
                        )
               )
            || ' paise ';
         v_amount := SUBSTR (amount, 1, INSTR (amount, '.') - 1);
         v_word :=
               TO_CHAR (TO_DATE (SUBSTR (v_amount, LENGTH (v_amount) - 2, 3),
                                 'J'
                                ),
                        'Jsp'
                       )
            || v_word;
         v_amount := SUBSTR (v_amount, 1, LENGTH (v_amount) - 3);

         FOR i IN 1 .. v_str.COUNT
         LOOP
            EXIT WHEN (v_amount IS NULL);
            v_word :=
                  TO_CHAR (TO_DATE (SUBSTR (v_amount, LENGTH (v_amount) - 1,
                                            2),
                                    'J'
                                   ),
                           'Jsp'
                          )
               || v_str (i)
               || v_word;
            v_amount := SUBSTR (v_amount, 1, LENGTH (v_amount) - 2);
         END LOOP;
      END IF;
   ELSE
      v_word := TO_CHAR (TO_DATE (TO_CHAR (amount, '999999999'), 'J'), 'JSP');
   END IF;

   v_word := v_word || ' ' || v_word1 || ' only ';
   v_word := REPLACE (RTRIM (v_word), ' ', ' ');
   v_word := REPLACE (RTRIM (v_word), '-', ' ');
   RETURN INITCAP (v_word);
END ruppee_to_word;

TEST SCRIPT:

SET serveroutput on;

BEGIN
   DBMS_OUTPUT.put_line (ruppee_to_word (1455555));
END;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Print Amount in french or other language

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




create or replace function spell_number( p_number in number )
  return varchar2
  -- original by Tom Kyte
  -- modified to include decimal places
  as
      type myArray is table of varchar2(255);
      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;
      -- beginning of section added to include decimal places:
      if to_char( p_number ) like '%.%'
      then
          l_num := substr( p_number, instr( p_number, '.' )+1 );
          if l_num > 0
          then
              l_return := l_return || ' point';
              for i in 1 .. length (l_num)
              loop
                  exit when l_num is null;
                  if substr( l_num, 1, 1 ) = '0'
                  then
                      l_return := l_return || ' zero';
                  else
                      l_return := l_return
                      || ' '
                      || to_char(
                             to_date(
                             substr( l_num, 1, 1),
                               'j' ),
                         'jsp' );
                  end if;
                  l_num := substr( l_num, 2 );
              end loop;
          end if;
      end if;
      -- end of section added to include decimal places
      return l_return;
  end spell_number;


create or replace function spell_number_french( p_number in number )
return varchar2 
as
begin
    return replace( replace( replace( replace( replace( 
           replace( replace( replace( replace( replace(
           replace( replace( replace( replace( replace(
           replace( replace( replace( replace( replace(
           replace( replace( replace( replace( replace(
           replace( replace( replace( replace( replace(
           replace( replace( replace( replace( replace(
           replace( replace( replace( replace( replace(
           replace(
           lower( spell_number( p_number ))
           , 'duodecillion', 'bidecillion'     )
           , 'quintillion' , 'cintillion'      )
           , 'billion'     , 'milliard'        )
           , 'thousand'    , 'mille'           )
           , 'hundred'     , 'cent'            )
           , 'ninety'      , 'quatre-vingt-dix')
           , 'eighty'      , 'quatre-vingt'    )
           , 'seventy'     , 'soixante-dix'    )
           , 'sixty'       , 'soixante'        )
           , 'fifty'       , 'cinquante'       )
           , 'forty'       , 'quarante'        )
           , 'thirty'      , 'trente'          )
           , 'twenty'      , 'vingt'           )
           , 'nineteen'    , 'dix-neuf'        )
           , 'eighteen'    , 'dix-huit'        )
           , 'seventeen'   , 'dix-sept'        )
           , 'sixteen'     , 'seize'           )
           , 'fifteen'     , 'quinze'          )
           , 'fourteen'    , 'quatorze'        )
           , 'thirteen'    , 'treize'          )
           , 'twelve'      , 'douze'           )
           , 'eleven'      , 'onze'            )
           , 'ten'         , 'dix'             )
           , 'nine'        , 'neuf'            )
           , 'eight'       , 'huit'            )
           , 'seven'       , 'sept'            )
           , 'five'        , 'cinq'            )
           , 'four'        , 'quatre'          )
           , 'three'       , 'trois'           )
           , 'two'         , 'deux'            )
           , 'one'         , 'un'              )
           , 'dix-six'     , 'seize'           )
           , 'dix-cinq'    , 'quinze'          )
           , 'dix-quatre'  , 'quatorze'        )
           , 'dix-trois'   , 'treize'          )
           , 'dix-deux'    , 'douze'           )
           , 'dix-un'      , 'onze'            )
           , '-un '        , '-une '           )
           , 'un cent'     , 'cent'            )
           , 'un mille'    , 'mille'           )
           , 'une'         , 'un' );

end spell_number_french;


select spell_number_french(121212344444) from dual;

No comments:

Post a Comment