Expresar o convertir un número en letras
Publicado: Jue Ene 20, 2011 3:46 pm
En esta ocasión os dejo un código PL/SQL a modo de package que dado un número devuelve la expresión del mismo en letras. Esta funcionalidad es especialmente útil para por ejemplo poder automatizar la impresión de cheques, donde las cifras se expresan además de en su representación decimal, en su expresión escrita.
Definición
Implementación
Test
Resultado
Que os aproveche.
Definición
- Código: Seleccionar todo
-- Programado por Pere Chardi
create or replace package expresar_en_letras is
function numero_a_letras(numero in number) return varchar2;
end expresar_en_letras;
Implementación
- Código: Seleccionar todo
-- Programado por Pere Chardi
create or replace package body expresar_en_letras is
-- definicion funcion local
function numero_menor_mil(numero in number) return varchar2;
-- implementacion
function numero_a_letras(numero in number) return varchar2 is
fuera_de_rango EXCEPTION;
millares_de_millon number;
millones number;
millares number;
centenas number;
centimos number;
en_letras varchar2(200);
entero number;
aux varchar2(15);
begin
if numero < 0 or numero > 999999999999.99 then
raise fuera_de_rango;
end if;
entero := trunc(numero);
millares_de_millon := trunc(entero / 1000000000);
millones := trunc((entero mod 1000000000) / 1000000);
millares := trunc((entero mod 1000000) / 1000);
centenas := entero mod 1000;
centimos := (round(numero,2) * 100) mod 100;
-- MILLARES DE MILLON
if millares_de_millon = 1 then
if millones = 0 then
en_letras := 'mil millones ';
else
en_letras := 'mil ';
end if;
elsif millares_de_millon > 1 then
en_letras := numero_menor_mil(millares_de_millon);
if millones = 0 then
en_letras := en_letras || 'mil millones ';
else
en_letras := en_letras || 'mil ';
end if;
end if;
-- MILLONES
if millones = 1 and millares_de_millon = 0 then
en_letras := 'un millón ';
elsif millones > 0 then
en_letras := en_letras || numero_menor_mil(millones) || 'millones ';
end if;
-- MILLARES
if millares = 1 and millares_de_millon = 0 and millones = 0 then
en_letras := 'mil ';
elsif millares > 0 then
en_letras := en_letras || numero_menor_mil(millares) || 'mil ';
end if;
-- CENTENAS
if centenas > 0 or (entero = 0 and centimos = 0) then
en_letras := en_letras || numero_menor_mil(centenas);
end if;
if centimos > 0 then
if centimos = 1 then
aux := 'céntimo';
else
aux := 'céntimos';
end if;
if entero > 0 then
en_letras := en_letras || 'con ' || replace(numero_menor_mil(centimos),'uno ','un ') || aux;
else
en_letras := en_letras || replace(numero_menor_mil(centimos),'uno','un') || aux;
end if;
end if;
return(en_letras);
EXCEPTION
when fuera_de_rango then
return('Error: entrada fuera de rango');
when others then
raise;
end;
function numero_menor_mil(numero in number) return varchar2 is
fuera_de_rango EXCEPTION;
no_entero EXCEPTION;
centenas number;
decenas number;
unidades number;
en_letras varchar2(100);
unir varchar2(2);
begin
if trunc(numero) <> numero then
raise no_entero;
end if;
if numero < 0 or numero > 999 then
raise fuera_de_rango;
end if;
if numero = 100 then
return ('cien ');
elsif numero = 0 then
return ('cero ');
elsif numero = 1 then
return ('uno ');
else
centenas := trunc(numero / 100);
decenas := trunc((numero mod 100)/10);
unidades := numero mod 10;
unir := 'y ';
-- CENTENAS
if centenas = 1 then
en_letras := 'ciento ';
elsif centenas = 2 then
en_letras := 'doscientos ';
elsif centenas = 3 then
en_letras := 'trescientos ';
elsif centenas = 4 then
en_letras := 'cuatrocientos ';
elsif centenas = 5 then
en_letras := 'quinientos ';
elsif centenas = 6 then
en_letras := 'seiscientos ';
elsif centenas = 7 then
en_letras := 'setecientos ';
elsif centenas = 8 then
en_letras := 'ochocientos ';
elsif centenas = 9 then
en_letras := 'novecientos ';
end if;
-- DECENAS
if decenas = 3 then
en_letras := en_letras || 'treinta ';
elsif decenas = 4 then
en_letras := en_letras || 'cuarenta ';
elsif decenas = 5 then
en_letras := en_letras || 'cincuenta ';
elsif decenas = 6 then
en_letras := en_letras || 'sesenta ';
elsif decenas = 7 then
en_letras := en_letras || 'setenta ';
elsif decenas = 8 then
en_letras := en_letras || 'ochenta ';
elsif decenas = 9 then
en_letras := en_letras || 'noventa ';
elsif decenas = 1 then
if unidades < 6 then
if unidades = 0 then
en_letras := en_letras || 'diez ';
elsif unidades = 1 then
en_letras := en_letras || 'once ';
elsif unidades = 2 then
en_letras := en_letras || 'doce ';
elsif unidades = 3 then
en_letras := en_letras || 'trece ';
elsif unidades = 4 then
en_letras := en_letras || 'catorce ';
elsif unidades = 5 then
en_letras := en_letras || 'quince ';
end if;
unidades := 0;
else
en_letras := en_letras || 'dieci';
unir := null;
end if;
elsif decenas = 2 then
if unidades = 0 then
en_letras := en_letras || 'veinte ';
else
en_letras := en_letras || 'veinti';
end if;
unir := null;
elsif decenas = 0 then
unir := null;
end if;
-- UNIDADES
if unidades = 1 then
en_letras := en_letras || unir || 'uno ';
elsif unidades = 2 then
en_letras := en_letras || unir || 'dos ';
elsif unidades = 3 then
en_letras := en_letras || unir || 'tres ';
elsif unidades = 4 then
en_letras := en_letras || unir || 'cuatro ';
elsif unidades = 5 then
en_letras := en_letras || unir || 'cinco ';
elsif unidades = 6 then
en_letras := en_letras || unir || 'seis ';
elsif unidades = 7 then
en_letras := en_letras || unir || 'siete ';
elsif unidades = 8 then
en_letras := en_letras || unir || 'ocho ';
elsif unidades = 9 then
en_letras := en_letras || unir || 'nueve ';
end if;
end if;
return(en_letras);
EXCEPTION
when no_entero then
return('Error: entrada no es un número entero');
when fuera_de_rango then
return('Error: entrada fuera de rango');
when others then
raise;
end;
end expresar_en_letras;
Test
- Código: Seleccionar todo
select expresar_en_letras.numero_a_letras( 563.78 ) from dual;
select expresar_en_letras.numero_a_letras( 1034563 ) from dual;
select expresar_en_letras.numero_a_letras( 32 ) from dual;
Resultado
- Código: Seleccionar todo
EXPRESAR_EN_LETRAS.NUMERO_A_LETRAS(563.78)
--------------------------------------------------------------------------------
quinientos sesenta y tres con setenta y ocho céntimos
1 row selected.
EXPRESAR_EN_LETRAS.NUMERO_A_LETRAS(1034563)
--------------------------------------------------------------------------------
un millón treinta y cuatro mil quinientos sesenta y tres
1 row selected.
EXPRESAR_EN_LETRAS.NUMERO_A_LETRAS(32)
--------------------------------------------------------------------------------
treinta y dos
1 row selected.
Que os aproveche.