5 de octubre de 2011

Convierte un número a letra

/************************************************
Convierte un número a letra
execute sp_ConvertNumberToLetter 91234.78, '',0,1
Ej: 3456 > Tres Mil Cuatrociectos Cincuenta y Seis
*************************************************/

CREATE PROCEDURE sp_ConvertNumberToLetter 
  @iNumber VARCHAR(20), 
  @sResult VARCHAR(2000) OUTPUT, 
  @bUpperCase BIT = 1, 
  @bForProvider BIT = 0 
 AS 
  DECLARE @sNumber AS VARCHAR(13) 
  DECLARE @iLenght AS TINYINT 
  DECLARE @iCounter AS TINYINT 
  DECLARE @iQuota AS TINYINT 
  DECLARE @sPlus AS VARCHAR(20) 
  DECLARE @iPosition AS TINYINT 
   
  DECLARE @sHundreds AS NVARCHAR(3) 
  DECLARE @sHundOfThou AS NVARCHAR(3)  
  DECLARE @sHundOfMill AS NVARCHAR(3)  
  DECLARE @sHundOfTril AS NVARCHAR(3)  
   
  DECLARE @sDecimal AS VARCHAR(2) 
  
  DECLARE @sResults1 AS VARCHAR(200)  
  DECLARE @sResults2 AS VARCHAR(200)  
  DECLARE @sResults3 AS VARCHAR(200)  
  DECLARE @sResults4 AS VARCHAR(200)  
   
  DECLARE @sSubNumber AS VARCHAR(25) 
  
  
  --Convierte el número en NVarchar 
  SELECT @sNumber = RTRIM(CAST(@iNumber AS VARCHAR(13))) 
  
  --Quita los espacios en Blanco 
  SET @sNumber = RTRIM ( LTRIM( @sNumber ) ) 
  
  --Inicia el contador en 1 
  SET @iCounter = 1 
  
  /*Separa la cantidad correspondiente a los centavos (SI EXISTEN)*/ 
 -- SELECT CHARINDEX( '.', @sNumber ) 
  IF CHARINDEX( '.', @sNumber ) <> 0  
   BEGIN 
    --Busca el lugar donde se encuentre el punto decimal y a partir del siguiente caracter  
    --lo convierte en la parte decimal del número 
    SET @sDecimal = SUBSTRING( @sNumber, CHARINDEX( '.', @sNumber ) + 1 , LEN( @sNumber ) ) 
 --    select @sdecimal, '@sdecimal' 
   --Desaparece esa parte decimal del número en general 
    IF RTRIM(@sDecimal) <> '' 
     BEGIN  
      SET @sNumber = SUBSTRING( @sNumber, 1, CHARINDEX( '.', @sNumber ) - 1 ) 
 --     select @snumber, '@snumber' 
     END 
   END 
  /*SI NO EXISTEN LOS PONE COMO 00/100*/ 
  ELSE 
   BEGIN 
    SET @sDecimal = '00' 
   END 
  
  --Invierte la cadena para obtener los números reales a convertir 
  SET @sNumber = REVERSE(@sNumber) 
   
 -- SELECT @sNumber  
  
  --Obtiene su longitud 
  SET @iLenght = LEN(@sNumber) 
  
  --Los separa en cantidades de 3 numeros 
  WHILE ( @iLenght > 0) AND ( @iCounter <= 4 ) 
   BEGIN 
 --   SELECT @sNumber , 'aqui toy'    
  
    /*Verifica que haya mas de 3 numeros en la cadena*/    
    IF @iLenght >= 3  
     BEGIN 
      SET @iQuota = 3 
     END  
    ELSE 
     BEGIN 
      SET @iQuota = @iLenght 
     END 
  
    /*Guarda en cada variable la cadena de números repartida*/ 
    IF @iCounter = 1 
     BEGIN 
      SET @sHundreds = SUBSTRING( @sNumber, 1 , @iQuota ) 
      SET @sHundreds = REVERSE( @sHundreds  )  
      END 
    IF @iCounter = 2 
     BEGIN 
      SET @sHundOfThou   = SUBSTRING( @sNumber, 1 , @iQuota )  
      SET @sHundOfThou  = REVERSE( @sHundOfThou ) 
     END 
    IF @iCounter = 3 
     BEGIN 
      SET @sHundOfMill = SUBSTRING( @sNumber, 1 , @iQuota ) 
      SET @sHundOfMill = REVERSE( @sHundOfMill ) 
     END 
    IF @iCounter = 4 
  
     BEGIN 
      SET @sHundOfTril = SUBSTRING( @sNumber, 1 , @iQuota ) 
      SET @sHundOfTril = REVERSE( @sHundOfTril ) 
     END      
         
    SET @sNumber = SUBSTRING(@sNumber , @iQuota + 1 , @ilenght ) 
  
    SET @iCounter = @iCounter + 1  
  
    --Obtiene su longitud 
    SET @iLenght = LEN(@sNumber)       
     
   END 
   
  /*Incializa las variables de resultados*/  
         SET @sResults1 = '' 
         set @sResults2 = '' 
         set @sResults3 = '' 
         set @sResults4 = '' 
  
 -- EXECUTE sp_ConvertHundredsOfThousands @sHundOfThou , @sResults2 OUTPUT 
  /*Unidades a Centenas*/ 
  EXECUTE sp_ConvertHundreds @sHundreds, @sResults1 OUTPUT  
  /*Unidades de Millar a Centenas de Millar  */ 
  EXECUTE sp_ConvertHundredsOfThousands @sHundOfThou , @sResults2 OUTPUT 
  /*Unidades de Millon as Centenas de Millon*/ 
  EXECUTE sp_ConvertHundredsOfMillion @sHundOfMill , @sResults3 OUTPUT 
  /*Unidades de Billon a Centenas de Billon*/ 
  EXECUTE sp_ConvertHundredsOfThousands @sHundOfTril , @sResults4 OUTPUT 
  
  /************************************************************ 
   Se evalúan las terminaciones que se agregarán para el caso de los Miles de Millones  
  *****************************************************************/ 
  IF ( RTRIM( @sResults3 ) = '' ) 

  AND ( RTRIM( @sResults4 ) <> '' ) 
  AND ( RTRIM( @sResults1 ) = '' )  
   BEGIN 
    SET @sPlus = 'Millones' 
   END  
  ELSE 
   BEGIN 
    SET @sPlus = '' 
   END 
     
  /*Se concatena el resultado*/ 
  SET @sResult = 

  LTRIM( RTRIM( @sResults4 ) ) + ' ' + @sPlus + 
  LTRIM( RTRIM( @sResults3 ) ) + ' '
  LTRIM( RTRIM( @sResults2 ) ) + ' ' + 
  LTRIM( RTRIM( @sResults1 ) )  
  
  /*Agrega la palabra 'Pesos' y los centavos*/ 
  SET @sResult = @sResult + ' Pesos' + ' ' + 

  LTRIM( RTRIM( @sDecimal ) ) + '/100 M.N.' 
    
  /*Verifica si es que existe alguna cantidad 

    antes de la palabra pesos, de no ser asi
    pone CERO*/ 
  IF CHARINDEX( 'P', LTRIM( @sResult ) ) = 1 
   BEGIN 
    SET @sResult = 'Cero ' + LTRIM( @sResult ) 
   END 
  
  /*Verifica que se escriba "UN PESO" y no "UN PESOS"*/ 
  IF ( CHARINDEX( 'UN', LTRIM( @sResult ) ) = 1 )  
     AND ( CHARINDEX( 'P', LTRIM( @sResult ) ) = 4 ) 
   BEGIN 
    SET @sResult = REPLACE( @sResult, 'Pesos', 'Peso' ) 
   END  
   
  /*Verifica que se introduzca la palabra "DE" en el caso de los millones cerrados (Cuando el Modulo es 0 se introduce)*/  
  /*Obtiene el número dividido entre 1 millón*/ 
  SET @sSubNumber = CAST( CAST( @iNumber AS DECIMAL ) / 1000000  AS VARCHAR(25) ) 
  /*Separa la cadena después del punto*/ 
  SET @sSubNumber = SUBSTRING( @sSubNumber , CHARINDEX( '.', @sSubNumber ) + 1 , LEN( @sSubNumber ) )  
  /*Comprueba después que la cadena separada sea mayor a 0 para poner la palabra "DE"*/ 
  IF CAST( @sSubNumber AS INTEGER ) = 0  
   BEGIN 
    SET @sResult = REPLACE ( @sResult, 'Pesos',  'de pesos') 
    SET @sResult = REPLACE ( @sResult, '  de', 'de') 
   END 
   
  
  /*Para la posteridad, reemplaza donde halla '  pesos'*/ 
  
  SET @sResult = REPLACE( @sResult, '  peso', ' peso' ) 
  
  SET @sResult = LTRIM( RTRIM( @sResult  ) ) 
  
  /*¿Se convierten a mayúsculas?*/ 
  IF @bUpperCase = 1 
   BEGIN 
    SET @sResult = LTRIM( RTRIM(UPPER( @sResult ) ) ) 
   END 
  
  /*¿Es una respuesta para el proveedor*/ 
  IF @bForProvider = 1 
   BEGIN 
    SELECT @sResult  
   END

2 comentarios:

  1. hola.. algun programador que me pueda ayudar con este ejercicio mediante pseudocodigo y utililizando la estructura de control selectiva multiple (si no si) bien el ejercicio es el sgte:
    se dispone de una maquina dispensadora de monedas : $5 dolares, $1dolar, $25 centavos, $5 centavos, $10 centavos, $1 centavo, la maquina recibe un monto de debe presentar en el menor numero de monedas posibles cuantas y de que tipos seran necesarias para para cubrir el monto

    ResponderEliminar
  2. I cannot thank lemeridian funding service enough and letting people know how grateful I am for all the assistance that you and your team staff have provided and I look forward to recommending friends and family should they need financial advice or assistance @ 1,9% Rate for Business Loan .Via Contact : . lfdsloans@lemeridianfds.com / lfdsloans@outlook.com. WhatsApp...+ 19893943740. Keep up the great work.
    Thanks, Busarakham.

    ResponderEliminar