Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Convertir numeros a letras

1,251 views
Skip to first unread message

Edwin

unread,
Mar 26, 2007, 1:30:14 PM3/26/07
to
Amigos,

Como hago en Sql Server para convertir numero a letras, por ejemplo
278.15 -> "DOCIENTOS OCHENTA Y SIETE 15/100".

Espero sus respuestas,

Gracias

Edwin Solórzano
www.exitoseguro.ws

Javier Loria

unread,
Mar 26, 2007, 1:53:13 PM3/26/07
to
Hola Edwin:
Puedes leer:
http://msmvps.com/blogs/jvargas/pages/convertirnumeroletras.aspx
Pero en una nota aparte, te parece que esto es responsabilidad de la
Base de Datos?, no deberia ser de algun componente desarrollado en algun
lenguaje "fuerte"?
Saludos,

Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

"Edwin" <sist...@indufoam.com> wrote in message
news:Ozw9tx8b...@TK2MSFTNGP03.phx.gbl...

Edwin

unread,
Mar 26, 2007, 4:32:14 PM3/26/07
to
Gracias Javier.


"Javier Loria" <jav...@nospam.com> escribió en el mensaje
news:ejBVr%238bHH...@TK2MSFTNGP02.phx.gbl...

Isaias

unread,
Mar 27, 2007, 9:44:49 PM3/27/07
to
CREATE PROCEDURE sp_Num2Let @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 AND @lnTerna = 1 THEN 'UNO ' + @lcCadena
WHEN @lnUnidades = 1 AND @lnTerna <> 1 THEN 'UN ' + @lcCadena
WHEN @lnUnidades = 2 THEN 'DOS ' + @lcCadena
WHEN @lnUnidades = 3 THEN 'TRES ' + @lcCadena
WHEN @lnUnidades = 4 THEN 'CUATRO ' + @lcCadena
WHEN @lnUnidades = 5 THEN 'CINCO ' + @lcCadena
WHEN @lnUnidades = 6 THEN 'SEIS ' + @lcCadena
WHEN @lnUnidades = 7 THEN 'SIETE ' + @lcCadena
WHEN @lnUnidades = 8 THEN 'OCHO ' + @lcCadena
WHEN @lnUnidades = 9 THEN 'NUEVE ' + @lcCadena
ELSE @lcCadena
END /* UNIDADES */
-- Analizo las decenas
SELECT @lcCadena =
CASE /* DECENAS */
WHEN @lnDecenas = 1 THEN
CASE @lnUnidades
WHEN 0 THEN 'DIEZ '
WHEN 1 THEN 'ONCE '
WHEN 2 THEN 'DOCE '
WHEN 3 THEN 'TRECE '
WHEN 4 THEN 'CATORCE '
WHEN 5 THEN 'QUINCE '
ELSE 'DIECI' + @lcCadena
END
WHEN @lnDecenas = 2 AND @lnUnidades = 0 THEN 'VEINTE ' + @lcCadena
WHEN @lnDecenas = 2 AND @lnUnidades <> 0 THEN 'VEINTI' + @lcCadena
WHEN @lnDecenas = 3 AND @lnUnidades = 0 THEN 'TREINTA ' + @lcCadena
WHEN @lnDecenas = 3 AND @lnUnidades <> 0 THEN 'TREINTA Y ' + @lcCadena
WHEN @lnDecenas = 4 AND @lnUnidades = 0 THEN 'CUARENTA ' + @lcCadena
WHEN @lnDecenas = 4 AND @lnUnidades <> 0 THEN 'CUARENTA Y ' + @lcCadena
WHEN @lnDecenas = 5 AND @lnUnidades = 0 THEN 'CINCUENTA ' + @lcCadena
WHEN @lnDecenas = 5 AND @lnUnidades <> 0 THEN 'CINCUENTA Y ' + @lcCadena
WHEN @lnDecenas = 6 AND @lnUnidades = 0 THEN 'SESENTA ' + @lcCadena
WHEN @lnDecenas = 6 AND @lnUnidades <> 0 THEN 'SESENTA Y ' + @lcCadena
WHEN @lnDecenas = 7 AND @lnUnidades = 0 THEN 'SETENTA ' + @lcCadena
WHEN @lnDecenas = 7 AND @lnUnidades <> 0 THEN 'SETENTA Y ' + @lcCadena
WHEN @lnDecenas = 8 AND @lnUnidades = 0 THEN 'OCHENTA ' + @lcCadena
WHEN @lnDecenas = 8 AND @lnUnidades <> 0 THEN 'OCHENTA Y ' + @lcCadena
WHEN @lnDecenas = 9 AND @lnUnidades = 0 THEN 'NOVENTA ' + @lcCadena
WHEN @lnDecenas = 9 AND @lnUnidades <> 0 THEN 'NOVENTA Y ' + @lcCadena
ELSE @lcCadena
END /* DECENAS */

-- Analizo las centenas
SELECT @lcCadena =
CASE /* CENTENAS */
WHEN @lnCentenas = 1 AND @lnUnidades = 0 AND @lnDecenas = 0 THEN 'CIEN ' +
@lcCadena
WHEN @lnCentenas = 1 AND NOT(@lnUnidades = 0 AND @lnDecenas = 0) THEN
'CIENTO ' + @lcCadena
WHEN @lnCentenas = 2 THEN 'DOSCIENTOS ' + @lcCadena
WHEN @lnCentenas = 3 THEN 'TRESCIENTOS ' + @lcCadena
WHEN @lnCentenas = 4 THEN 'CUATROCIENTOS ' + @lcCadena
WHEN @lnCentenas = 5 THEN 'QUINIENTOS ' + @lcCadena
WHEN @lnCentenas = 6 THEN 'SEISCIENTOS ' + @lcCadena
WHEN @lnCentenas = 7 THEN 'SETECIENTOS ' + @lcCadena
WHEN @lnCentenas = 8 THEN 'OCHOCIENTOS ' + @lcCadena
WHEN @lnCentenas = 9 THEN 'NOVECIENTOS ' + @lcCadena
ELSE @lcCadena
END /* CENTENAS */
-- Analizo la terna
SELECT @lcCadena =
CASE /* TERNA */
WHEN @lnTerna = 1 THEN @lcCadena
WHEN @lnTerna = 2 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN
@lcCadena + ' MIL '
WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0 THEN @lcCadena + '
MILLON '
WHEN @lnTerna = 3 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) AND
NOT (@lnUnidades = 1 AND @lnDecenas = 0 AND @lnCentenas = 0) THEN @lcCadena
+ ' MILLONES '
WHEN @lnTerna = 4 AND (@lnUnidades + @lnDecenas + @lnCentenas <> 0) THEN
@lcCadena + ' MIL MILLONES '
ELSE ''
END /* TERNA */
-- Armo el retorno terna a terna
SELECT @lcRetorno = @lcCadena + @lcRetorno
SELECT @lnTerna = @lnTerna + 1
END /* WHILE */
IF @lnTerna = 1
SELECT @lcRetorno = 'CERO'
SELECT RTRIM(@lcRetorno) + ' CON ' + LTRIM(STR(@lnFraccion,2)) + '/100'
END

GO

--
Saludos
IIslas

Minothauro

unread,
Mar 28, 2007, 8:40:36 AM3/28/07
to
Hola, te cuento que no se recomienda utilizar la lógica de SQL para
realizar operaciones de este tipo, por una cuestion de optimizacion.
SQL Server 2005 trae la posibilidad de realizar usa "funcion" a traves
de VB.Net por ejemplo y ser utilizado en la sentencia SQL deseada.


Atte.

Maxi

unread,
Mar 28, 2007, 9:06:25 AM3/28/07
to
Hola, es totalmente cierto esto, pero nuestro amigo no ha comentado que SQL
tiene :(

--

Salu2

-----------------------------------------
Microsoft MVP SQL Server
Culminis Speaker
------------------------------------------
"Minothauro" <wmag...@gmail.com> escribió en el mensaje
news:1175085636.2...@n59g2000hsh.googlegroups.com...

0 new messages