Esta función convertirá los números en palabras. Ejm 123 -> ciento veintitrés
CREATE OR REPLACE FUNCTION base.num_a_letras(numero numeric)
RETURNS character varying AS
$BODY$
DECLARE
-- Victor E. Milla Mora, copiado del mismo foro de postgres, pero se hizo algunos ajustes.
/* Forma de llamar :
maximo numero 999999999.99
select base.num_a_letras(123.09)
select base.num_a_letras(675)
*/
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(cast(lnEntero as varchar));
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 := lcRetorno || ' CON ' || lpad(trim(both ' ' from cast(lnFraccion as varchar)) ,2,'0') || '/100 NUEVOS SOLES';
RETURN lcRetorno;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION base.num_a_letras(numeric) OWNER TO postgres;
No hay comentarios:
Publicar un comentario