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 |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
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
From | Date | Subject | |
---|---|---|---|
Next Message | Mario Gonzalez | 2007-06-22 19:18:15 | Re: Banco de prueba de varias versiones de postgresql |
Previous Message | Calabaza Calabaza | 2007-06-22 19:06:30 | Re: Banco de prueba de varias versiones de postgresql |