Función Que Convierte Números A Letras En SQL

Varios Add comments

                                SQL

Este es código de una función que convierte los números a letras en SQL, podrán observar que es algo complicada (en lo personal lo más complicado son los triggers) y que en SQL no todo es consulta de datos…

Pueden ponerlo en cualquier programa y probarlo.

Utiliza el "go" así que permite copiarlo todo y ejecutarlo al mismo tiempo.

--CREATE FUNCTION NumeroEnLetra(@NumeroAProcesar as varchar(30)) 
create FUNCTION NumeroEnLetra(@NumeroAProcesar as varchar(30)) 
RETURNS varchar(500) AS
BEGIN 
DECLARE @Numero bigint
DECLARE @Decimal varchar(30)
DECLARE @Texto varchar(500)
DECLARE @EstiloMillares bit
SELECT @Texto=''
/* Obtenemos parte entera */
IF patindex('%.%', @NumeroAProcesar)>0
BEGIN
SELECT @Numero=LEFT(@NumeroAProcesar, 
patindex('%.%', @NumeroAProcesar)-1)
END
ELSE
BEGIN
SELECT @Numero=CONVERT(bigint, @NumeroAProcesar)
END
SELECT @EstiloMillares=CONVERT(bit,LEN(@Numero)-7)
/* Proceso número negativos */
IF @Numero<0
BEGIN 
SELECT @Texto='menos ' 
SELECT @Numero=ABS(@Numero)
END
/* Proceso parte entera */
SELECT @Texto= @Texto +
CASE 
WHEN @Numero=1000000 THEN 'MILLON'
WHEN @Numero>1000000 AND @Numero<1000000000000 THEN 
dbo.F_Millares(
LEFT(CONVERT(varchar, @Numero), LEN(@Numero)-6), 
@EstiloMillares) +
' MILLONES ' +
dbo.F_Millares(RIGHT(CONVERT(varchar, @Numero), 6), 1)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, 1)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, 1)
WHEN @Numero<1000000 THEN dbo.F_Millares(@Numero, 1)
END
/* Proceso parte decimal */
IF patindex('%.%', @NumeroAProcesar)>0
BEGIN
SELECT @Decimal=
RIGHT(@NumeroAProcesar, 
LEN(@NumeroAProcesar)-patindex('%.%', @NumeroAProcesar))
SELECT @Numero=@Decimal
SELECT @Texto= @Texto + 'CON ' +
CASE 
WHEN @Numero=1000000 THEN 'MILLON'
WHEN @Numero>1000000 AND @Numero<1000000000000 THEN 
dbo.F_Millares(
LEFT(CONVERT(varchar, @Numero), LEN(@Numero)-6), 
@EstiloMillares) +
' MILLONES ' + 
dbo.F_Millares(RIGHT(CONVERT(varchar, @Numero), 6), 1)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, 1)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, 1)
WHEN @Numero<1000000 THEN dbo.F_Millares(@Numero, 1)
END
SELECT @Texto = @Texto +
CASE 
WHEN LEN(@Decimal)=1 THEN ' CENTAVOS DE DOLAR'
WHEN LEN(@Decimal)=2 THEN ' CENTAVOS DE DOLAR'
WHEN LEN(@Decimal)=3 THEN ' CENTAVOS DE DOLAR'
END
END
RETURN @Texto
END 
go
--En el proceso principal se delega el procesado de la parte entera y decimal de un número en las funciones de apoyo. 
--Función para unidades 
--Función que devuelve en letra las unidades. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 
--Figura 2. 
--CREATE FUNCTION F_Unidades(@Numero as bigint, @Estilo as bit=0) 
create FUNCTION F_Unidades(@Numero as bigint, @Estilo as bit=0) 
RETURNS varchar(500) AS 
BEGIN 
DECLARE @Texto varchar(500)
SELECT @Texto=''
SELECT @Texto=
CASE 
WHEN @Numero=0 THEN 'CERO '
WHEN @Numero=1 THEN 'UNO '
WHEN @Numero=2 AND @Estilo=0 THEN 'DOS '
WHEN @Numero=2 AND @Estilo=1 THEN 'DOS '
WHEN @Numero=3 AND @Estilo=0 THEN 'TRES '
WHEN @Numero=3 AND @Estilo=1 THEN 'TRES '
WHEN @Numero=4 THEN 'CUATRO '
WHEN @Numero=5 THEN 'CINCO '
WHEN @Numero=6 AND @Estilo=0 THEN 'SEIS '
WHEN @Numero=6 AND @Estilo=1 THEN 'SEIS '
WHEN @Numero=7 THEN 'SIETE '
WHEN @Numero=8 THEN 'OCHO '
WHEN @Numero=9 AND @Estilo=0 THEN 'NUEVE '
WHEN @Numero=9 AND @Estilo=1 THEN 'NOVE '
END
RETURN @Texto
END 
go
--Función para decenas 
--Función que devuelve en letra las decenas. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 
--Figura 3. 
---CREATE FUNCTION F_Decenas(@Numero as bigint, @Estilo as bit=0) 
create FUNCTION F_Decenas(@Numero as bigint, @Estilo as bit=0) 
RETURNS varchar(500) AS 
BEGIN 
DECLARE @Texto varchar(500)
SELECT @Texto=''
SELECT @Texto= 
CASE 
WHEN @Numero=0 THEN ' '
WHEN @Numero=10 THEN 'DIEZ '
WHEN @Numero=11 THEN 'ONCE '
WHEN @Numero=12 THEN 'DOCE '
WHEN @Numero=13 THEN 'TRECE '
WHEN @Numero=14 THEN 'CATORCE '
WHEN @Numero=15 THEN 'QUINCE '
WHEN @Numero>15 and @Numero<19 THEN 'DIECI' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 1)
WHEN @Numero=19 THEN 'DIECINUEVE'
WHEN @Numero=20 THEN 'VEINTE'
WHEN @Numero>20 and @Numero<30 THEN 'VEINTI' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 1)
WHEN @Numero=30 THEN 'TREINTA'
WHEN @Numero>30 and @Numero<40 THEN 'TREINTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=40 THEN 'CUARENTA'
WHEN @Numero>40 and @Numero<50 THEN 'CUARENTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=50 THEN 'CINCUENTA'
WHEN @Numero>50 and @Numero<60 THEN 'CINCUENTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=60 THEN 'SESENTA'
WHEN @Numero>60 and @Numero<70 THEN 'SESENTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=70 THEN 'SETENTA'
WHEN @Numero>70 and @Numero<80 THEN 'SETENTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=80 THEN 'OCHENTA'
WHEN @Numero>80 and @Numero<90 THEN 'OCHENTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero=90 THEN 'NOVENTA'
WHEN @Numero>90 and @Numero<100 THEN 'NOVENTA Y ' + 
dbo.F_Unidades(RIGHT(CONVERT(varchar, @Numero), 1), 0)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, @Estilo)
END
RETURN @Texto
END 
go
--Función para centenas 
--Función que devuelve en letra las centenas. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 
--Figura 4. 
--CREATE FUNCTION F_Centenas(@Numero as bigint, @Estilo as bit=0) 
create FUNCTION F_Centenas(@Numero as bigint, @Estilo as bit=0) 
RETURNS varchar(500) AS 
BEGIN 
DECLARE @Texto varchar(500)
SELECT @Texto=''
SELECT @Texto=
CASE 
WHEN @Numero=000 THEN ' '
WHEN @Numero=100 THEN 'CIEN'
WHEN @Numero>100 and @Numero<200 THEN 'CIENTO ' + 
dbo.F_Decenas(RIGHT(CONVERT(varchar, @Numero), 2), 0)
WHEN (@Numero>=200 and @Numero<500) or 
(@Numero>500 and @Numero<1000) THEN 
dbo.F_Decenas(LEFT(CONVERT(varchar, @Numero), 1), 1) + 
'CIENTOS ' + 
dbo.F_Decenas(RIGHT(CONVERT(varchar, @Numero), 2), 1)
WHEN @Numero=500 THEN 'QUINIENTOS'
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, @Estilo)
END
RETURN @Texto
END 
go
--Función para millares 
---Función que devuelve en letra los millares. El párametro @Estilo permite identificar los distintos valores que puede tener un mismo número. 
---Figura 5. 
--CREATE FUNCTION F_Millares(@Numero as bigint, @Estilo as bit=0) 
create FUNCTION F_Millares(@Numero as bigint, @Estilo as bit=0) 
RETURNS varchar(500) AS 
BEGIN 
DECLARE @Texto varchar(500)
DECLARE @EstiloCentenas bit
SELECT @EstiloCentenas=CONVERT(bit,LEN(@Numero)-4)
SELECT @Texto=
CASE 
WHEN @Numero=0000 THEN ' '
WHEN @Numero=1000 THEN 'MIL'
WHEN @Numero>1000 and @Numero<2000 THEN 'MIL ' + 
dbo.F_Centenas(RIGHT(CONVERT(varchar, @Numero), 3), 1)
WHEN @Numero>2000 and @Numero<1000000 THEN 
dbo.F_Centenas(LEFT(CONVERT(varchar, @Numero), LEN(@Numero)-3), 
@EstiloCentenas) + 
' MIL ' + 
dbo.F_Centenas(RIGHT(CONVERT(varchar, @Numero), 3), 1)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, @Estilo)
WHEN @Numero<10 THEN dbo.F_Unidades(@Numero, 0)
WHEN @Numero<100 THEN dbo.F_Decenas(@Numero, @Estilo)
WHEN @Numero<1000 THEN dbo.F_Centenas(@Numero, @Estilo)
END
RETURN @Texto
END 
 

Artículos Relacionados:

Deja Un Comentario


WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in