Skip site navigation (1) Skip section navigation (2)

FW: convertir numeros a letras

From: Javier Bermúdez Tito <javier_bt(at)hotmail(dot)com>
To: Ayuda Postgres PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: FW: convertir numeros a letras
Date: 2007-06-22 19:08:21
Message-ID: BAY129-W21F047B69802A476BE40E485170@phx.gbl (view raw or flat)
Thread:
Lists: pgsql-es-ayuda




Hola listeros aqui tambien tienen otra alternativa para convertir numero a letras, lo tube que convertir de otro lenguage de programacion a plpgsql espero les sirva, el que quiera podria modificar la funcion para que acepte cualquier tipo de moneda es bien simple la funcion pero muy efectiva lo uso en mi sistema integrado sin problemas ahi les dejo el codigo acepta hasta  select fu_numero_letras(999999999.99);  CREATE OR REPLACE FUNCTION fu_numero_letras(numero numeric) RETURNS text AS$body$DECLARE     lnEntero INTEGER;     lcRetorno TEXT;     lnTerna INTEGER;     lcMiles TEXT;     lcCadena TEXT;     lnUnidades INTEGER;     lnDecenas INTEGER;     lnCentenas INTEGER;     lnFraccion INTEGER;     lnSw INTEGER;BEGIN     lnEntero := FLOOR(numero)::INTEGER;--Obtenemos la parte Entera     lnFraccion := FLOOR(((numero - lnEntero) * 100))::INTEGER;--Obtenemos la Fraccion del Monto     lcRetorno := '';     lnTerna := 1;     IF lnEntero > 0 THEN     lnSw := LENGTH(lnEntero);     WHILE lnTerna <= lnSw LOOP        -- Recorro terna por terna        lcCadena = '';        lnUnidades = lnEntero % 10;        lnEntero = CAST(lnEntero/10 AS INTEGER);        lnDecenas = lnEntero % 10;        lnEntero = CAST(lnEntero/10 AS INTEGER);        lnCentenas = lnEntero % 10;        lnEntero = CAST(lnEntero/10 AS INTEGER);    -- Analizo las unidades       SELECT         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 INTO lcCadena;          /* UNIDADES */    -- Analizo las decenas    SELECT    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 INTO lcCadena; /* DECENAS */    -- Analizo las centenas    SELECT    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 INTO lcCadena;/* CENTENAS */    -- Analizo la terna    SELECT    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 INTO lcCadena;/* TERNA */    --Retornamos los Valores Obtenidos    lcRetorno = lcCadena  || lcRetorno;    lnTerna = lnTerna + 1;    END LOOP;  END IF;  IF lnTerna = 1 THEN    lcRetorno := 'CERO';  END IF;  lcRetorno := RTRIM(lcRetorno) || ' CON ' || LTRIM(lnFraccion) || '/100 NUEVOS SOLES';RETURN lcRetorno;END;$body$LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; COMMENT ON FUNCTION fu_numero_letras(numero numeric)IS 'Funcion para Convertir el Monto Numerico a Letras';        

> Date: Fri, 22 Jun 2007 12:44:40 -0400> From: calalinux(at)gmail(dot)com> To: pgsql-es-ayuda(at)postgresql(dot)org> Subject: Re: [pgsql-es-ayuda] convertir numeros a letras> > El 22/06/07, Guido Barosio <gbarosio(at)gmail(dot)com> escribió:> > Creo que es poco optimo encarar este problema desde el lado de la base> > de datos, pensaste hacerlo en la aplicacion?> > Si lo pense; yo programo en jsp+ireport tengo mi funcion para el jsp> pero al crear un reporte maestro-detalle me parecio mas simple pasar> los datos del maestro como parametros y el detalle lo recupero a> traves de sql y entonces ahi necesito los importes en letras y para> eso es la funcion, tambien tube otro problema al imprimir cheques y mi> solucion temporal fue guardar el importe en letras en la bd (nada> optimo) xq no tenia tiempo de buscar esta funcion y tampoco sabia como> hacerlo ahora estoy mis baches de conocimiento poco a poco je=);> > > Digno de un WTF! :-)> No se que significa eso....> > Y de todos modos me sirve para probar mis conocimientos pl/pgsql je!> -- > §~^Calabaza^~§ from Paraguay> --> ---------------------------(fin del mensaje)---------------------------> TIP 5: ¿Has leído nuestro extenso FAQ?> http://www.postgresql.org/files/documentation/faqs/FAQ.html

Get news, entertainment and everything you care about at Live.com. Check it out! 
_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE

Responses

pgsql-es-ayuda by date

Next:From: Mario GonzalezDate: 2007-06-22 19:18:15
Subject: Re: Banco de prueba de varias versiones de postgresql
Previous:From: Calabaza CalabazaDate: 2007-06-22 19:06:30
Subject: Re: Banco de prueba de varias versiones de postgresql

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group