Pages

Tuesday, March 22, 2016

MySQL function for amount to words

The following MySQL functions used to convert number to words. If we need to print amount in words this function will help.

You need to create 2 functions to achieve this.
1) AmountToWords
2) Number2Char

Usage : SELECT AmountToWords(4896.50)
OutPut : ( Rupees Four Thousand Eight Hundred Ninety Six and Paise Fifty Only. )

AmountToWords Function code

CREATE DEFINER=`pmc_dms_user`@`%` FUNCTION `AmountToWords`(
    `nAmount` DECIMAL(11,2))
RETURNS varchar(2000) CHARSET utf8
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE AMT_Words   VARCHAR(2000) ;
DECLARE AMT_Text1   VARCHAR(2000) ;
DECLARE AMT_Text2   VARCHAR(2000) ;
DECLARE AMT_Text3   VARCHAR(2000) ;
DECLARE Words          VARCHAR(2000) ;
DECLARE Rupee_Txt      VARCHAR(2000) ;
DECLARE RupeeTxt      VARCHAR(2000) ;
DECLARE SP_Txt1      VARCHAR(2000) ;
DECLARE SP_Txt2      VARCHAR(2000) ;
DECLARE SP_Txt3      VARCHAR(2000) ;
DECLARE Decimal_Txt VARCHAR(20)      ;

DECLARE WP              INT;
DECLARE SP              INT;
DECLARE RLEN          INT;
DECLARE PLEN        INT;
DECLARE _Rupee          INT;
DECLARE _Decimal      INT;
  
  
    SET AMT_Words   = '( Rupees ';
    SET AMT_Text1   = ' One ,Two ,Three ,Four ,Five ,Six ,Seven ,Eight ,Nine ,Ten ';
    SET AMT_Text1   = CONCAT(AMT_Text1,',Eleven ,Twelve ,Thirteen ,Forteen ,Fifteen ,Sixteen ,Seventeen ,Eighteen ,Nineteen ,Twenty ');
    SET AMT_Text2   = ' Twenty ,Thirty ,Fourty ,Fifty ,Sixty ,Seventy ,Eighty ,Ninety ';
    SET AMT_Text3   = ' Crore ,Lakh ,Thousand ,Hundred , ';  
    SET Rupee_Txt   = '';
    SET RupeeTxt    = '';
    SET Decimal_Txt = '';
    SET SP_Txt3     = '';
    SET WP              = 1 ;
    SET SP             = 1 ;
    SET Words       = '';
    SET _Rupee      = TRUNCATE(nAmount,0);
    SET RLEN             = 9-LENGTH(_Rupee);
    SET Rupee_Txt   = CONCAT(SPACE(RLEN),CONVERT(_Rupee,CHAR)) ;
  
    SET _Decimal    = CAST(SUBSTRING_INDEX(nAmount,'.',-1) AS UNSIGNED);  
    SET PLEN          = 2-LENGTH(_Decimal);
    SET Decimal_Txt = CONCAT(SPACE(PLEN),CONVERT(_Decimal,CHAR));


    WHILE WP < 6 DO
  
       IF SP =  7 THEN
         
           SET RupeeTxt = SUBSTRING(Rupee_Txt,SP,1);
               SET SP =SP+1;
           SET RupeeTxt = CONCAT('0',RupeeTxt);
           SET Words=Number2Char(RupeeTxt,AMT_Text1,AMT_Text2);
                 
       ELSE
                          
          SET RupeeTxt = SubString(Rupee_Txt,SP,2);
          SET SP =SP+2;
           SET Words=Number2Char(RupeeTxt,AMT_Text1,AMT_Text2);
                                   
       END IF; 
     
       IF Words != '' THEN
    
           IF AMT_Words != '' AND WP = 6 THEN         
               SET AMT_Words =CONCAT(AMT_Words,'and ');      
           END IF;
          
            SET SP_Txt1 = SUBSTRING_INDEX(AMT_Text3,',',WP);
            SET SP_Txt2 = SUBSTRING_INDEX(SP_Txt1,',',WP-1);
            SET SP_Txt3 = SUBSTRING(SP_Txt1,LENGTH(SP_Txt2)+2,LENGTH(SP_Txt1));
           SET AMT_Words = CONCAT(AMT_Words,Words,SP_Txt3) ;
         
       END IF;
     
       SET WP = WP+1; 
          
    END WHILE;

    IF AMT_Words != '' THEN
        SET AMT_Words = CONCAT(AMT_Words,' ');
    END IF;
  
    /*End of Rupee Side*/
  
    SET Words=Number2Char(Decimal_Txt,AMT_Text1,AMT_Text2);
  
    IF Words != '' AND AMT_Words != "" THEN
        SET AMT_Words = CONCAT(TRIM(AMT_Words),' and ', 'Paise ');
    END IF;
  
    IF Words != '' THEN
            SET AMT_Words = CONCAT(AMT_Words,Words);
    END IF;
  
    IF AMT_Words != '' THEN
        SET AMT_Words = CONCAT(TRIM(AMT_Words),' Only. )');
    END IF;

    RETURN AMT_Words;
 
END
Number2Char Function Code

CREATE DEFINER=`pmc_dms_user`@`%` FUNCTION `Number2Char`(
    `cDigits` VARCHAR(500),
    `cAMT_Text1` VARCHAR(500),
    `cAMT_Text2` VARCHAR(500))
RETURNS varchar(2000) CHARSET utf8
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE Words VARCHAR(2000);
DECLARE AMT_Txt1 VARCHAR(2000);
DECLARE AMT_Txt2 VARCHAR(2000);
DECLARE AMT_Txt3 VARCHAR(2000);
DECLARE Digits INT;
DECLARE Value  INT;

SET Words ='';
    IF cDigits > '20' THEN  
 
        SET Digits = CAST(LEFT(cDigits,1) AS UNSIGNED)-1;
      
        SET AMT_Txt1 = SUBSTRING_INDEX(cAMT_Text2,',',Digits);
        SET AMT_Txt2 = SUBSTRING_INDEX(AMT_Txt1,',',Digits-1);  
        SET Words =SUBSTRING(AMT_Txt1,LENGTH(AMT_Txt2)+2,LENGTH(AMT_Txt1));
      
        SET cDigits = CONCAT("0",RIGHT(cDigits,1)) ;
      
    END IF;
  
        SET Digits = CAST(cDigits AS UNSIGNED);
  
        SET AMT_Txt1 = SUBSTRING_INDEX(cAMT_Text1,',',Digits);
        SET AMT_Txt2 = SUBSTRING_INDEX(AMT_Txt1,',',Digits-1);  
        SET AMT_Txt3 = SUBSTRING(AMT_Txt1,LENGTH(AMT_Txt2)+2,LENGTH(AMT_Txt1));
        SET Words =CONCAT(Words,AMT_Txt3);

RETURN Words;

END

8 comments:

  1. This function is throwing error : 1292, Truncated incorrect Integer value : " "

    ReplyDelete
  2. Truncated incorrect INTEGER value: ' ' when i enter less then 9 crore that time give this error

    ReplyDelete
  3. Truncated incorrect INTEGER value: ' ' how to solve this error

    ReplyDelete
  4. INTEGER value: - I can't reproduce this error when I tested. At my end this function working without any error. Thank you..

    ReplyDelete
  5. This function is throwing error : 1292, Truncated incorrect Integer value : " "

    ReplyDelete
  6. You have to change CONCAT(SPACE(RLEN),CONVERT(_Rupee,CHAR)) ; this line to CONCAT(repeat('0',RLEN),CONVERT(_Rupee,CHAR)) ; The Error will be fixed.

    ReplyDelete
  7. Hi all
    I have modified the "Number2Char" function and it is working correctly for values up to 99 crores. Please check if it works for you.
    Regards
    Vadi, Bengaluru

    DROP FUNCTION IF EXISTS `Number2Char`;

    DELIMITER $$
    CREATE FUNCTION `Number2Char`(
    `cDigits` VARCHAR(500),
    `cAMT_Text1` VARCHAR(500),
    `cAMT_Text2` VARCHAR(500))
    RETURNS varchar(2000) CHARSET utf8
    LANGUAGE SQL
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
    BEGIN

    DECLARE Words VARCHAR(2000);
    DECLARE AMT_Txt1 VARCHAR(2000);
    DECLARE AMT_Txt2 VARCHAR(2000);
    DECLARE AMT_Txt3 VARCHAR(2000);
    DECLARE Digits INT;
    DECLARE Value INT;

    SET Words ='';
    IF cDigits > '20' THEN

    SET Digits = CAST(LEFT(cDigits,1) AS UNSIGNED)-1;

    SET AMT_Txt1 = SUBSTRING_INDEX(cAMT_Text2,',',Digits);
    SET AMT_Txt2 = SUBSTRING_INDEX(AMT_Txt1,',',Digits-1);
    SET Words =SUBSTRING(AMT_Txt1,LENGTH(AMT_Txt2)+2,LENGTH(AMT_Txt1));

    SET cDigits = CONCAT("0",RIGHT(cDigits,1)) ;

    END IF;

    IF REPLACE(cDigits, ' ', '') = '' OR REPLACE(cDigits, ' ', '') = 0 THEN
    SET Digits = 0;
    ELSE
    SET Digits = CAST(cDigits AS UNSIGNED);
    END IF;

    SET AMT_Txt1 = SUBSTRING_INDEX(cAMT_Text1,',',Digits);
    SET AMT_Txt2 = SUBSTRING_INDEX(AMT_Txt1,',',Digits-1);
    SET AMT_Txt3 = SUBSTRING(AMT_Txt1,LENGTH(AMT_Txt2)+2,LENGTH(AMT_Txt1));
    SET Words =CONCAT(Words,AMT_Txt3);

    RETURN Words;

    END$$
    DELIMITER ;

    ReplyDelete