Retorna una cadena en Inglés
Ejemplo:
EXECUTE sp_Num2Word 3245.35
--> THREE THOUSAND TWO HUNDRED FORTY FIVE AND 35/100
/* Stored Procedure */
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[sp_Num2Word]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[sp_Num2Word]
GO
SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO
CREATE PROCEDURE sp_Num2Word @Numero NUMERIC(20,2) AS
BEGIN
SET NOCOUNT ON
DECLARE @lnEntero INT,
@lcRetorno VARCHAR(512),
@lnTerna INT,
@lcMiles VARCHAR(512),
@lcCadena VARCHAR(512),
@lnUnidades INT,
@lnDecenas INT,
@lnCentenas INT,
@lnFraccion INT
SELECT @lnEntero = CAST(@Numero AS INT),
@lnFraccion = (@Numero - @lnEntero) * 100,
@lcRetorno = '',
@lnTerna = 1
WHILE @lnEntero > 0
BEGIN /* WHILE */
-- Recorro terna por terna
SELECT @lcCadena = ''
SELECT @lnUnidades = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
SELECT @lnDecenas = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
SELECT @lnCentenas = @lnEntero % 10
SELECT @lnEntero = CAST(@lnEntero/10 AS INT)
-- Analizo las unidades
SELECT @lcCadena =
CASE /* UNIDADES */
WHEN @lnUnidades = 1 THEN 'ONE ' + @lcCadena
WHEN @lnUnidades = 2 THEN 'TWO ' + @lcCadena
WHEN @lnUnidades = 3 THEN 'THREE ' + @lcCadena
WHEN @lnUnidades = 4 THEN 'FOUR ' + @lcCadena
WHEN @lnUnidades = 5 THEN 'FIVE ' + @lcCadena
WHEN @lnUnidades = 6 THEN 'SIX ' + @lcCadena
WHEN @lnUnidades = 7 THEN 'SEVEN ' + @lcCadena
WHEN @lnUnidades = 8 THEN 'EIGHT ' + @lcCadena
WHEN @lnUnidades = 9 THEN 'NINE ' + @lcCadena
ELSE @lcCadena
END /* UNIDADES */
-- Analizo las decenas
SELECT @lcCadena =
CASE /* DECENAS */
WHEN @lnDecenas = 1 THEN
CASE @lnUnidades
WHEN 0 THEN 'TEN '
WHEN 1 THEN 'ELEVEN '
WHEN 2 THEN 'TWELVE '
WHEN 3 THEN 'THIRTEEN '
WHEN 4 THEN 'FOURTEEN '
WHEN 5 THEN 'FIFTEEN '
WHEN 6 THEN 'SIXTEEN '
WHEN 7 THEN 'SEVENTEEN '
WHEN 8 THEN 'EIGHTEEN '
WHEN 9 THEN 'NINETEEN '
END
WHEN @lnDecenas = 2 THEN 'TWENTY ' + @lcCadena
WHEN @lnDecenas = 3 THEN 'THIRTY ' + @lcCadena
WHEN @lnDecenas = 4 THEN 'FORTY ' + @lcCadena
WHEN @lnDecenas = 5 THEN 'FIFTY ' + @lcCadena
WHEN @lnDecenas = 6 THEN 'SIXTY ' + @lcCadena
WHEN @lnDecenas = 7 THEN 'SEVENTY ' + @lcCadena
WHEN @lnDecenas = 8 THEN 'EIGHTY ' + @lcCadena
WHEN @lnDecenas = 9 THEN 'NINETY ' + @lcCadena
ELSE @lcCadena
END /* DECENAS */
-- Analizo las centenas
SELECT @lcCadena =
CASE /* CENTENAS */
WHEN @lnCentenas = 1 THEN 'ONE HUNDRED ' + @lcCadena
WHEN @lnCentenas = 2 THEN 'TWO HUNDRED ' + @lcCadena
WHEN @lnCentenas = 3 THEN 'THREE HUNDRED ' + @lcCadena
WHEN @lnCentenas = 4 THEN 'FOUR HUNDRED ' + @lcCadena
WHEN @lnCentenas = 5 THEN 'FIVE HUNDRED ' + @lcCadena
WHEN @lnCentenas = 6 THEN 'SIX HUNDRED ' + @lcCadena
WHEN @lnCentenas = 7 THEN 'SEVEN HUNDRED ' + @lcCadena
WHEN @lnCentenas = 8 THEN 'EIGHT HUNDRED ' + @lcCadena
WHEN @lnCentenas = 9 THEN 'NINE HUNDRED ' + @lcCadena
ELSE @lcCadena
END /* CENTENAS */
-- Analizo la terna
SELECT @lcCadena =
CASE /* TERNA */
WHEN @lnTerna = 1 THEN @lcCadena
WHEN @lnTerna = 2 THEN @lcCadena + ' THOUSAND '
WHEN @lnTerna = 3 THEN @lcCadena + ' MILLON '
WHEN @lnTerna = 4 THEN @lcCadena + ' BILLON '
ELSE ''
END /* TERNA */
-- Armo el retorno terna a terna
SELECT @lcRetorno = @lcCadena + @lcRetorno
SELECT @lnTerna = @lnTerna + 1
END /* WHILE */
IF @lnTerna = 1
SELECT @lcRetorno = 'ZERO'
SELECT RTRIM(@lcRetorno) + ' AND ' + LTRIM(STR(@lnFraccion,2)) + '/100'
END
GO
SET QUOTED_IDENTIFIER OFF
SET ANSI_NULLS ON
GO
Luis María Guayán
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.