Inicio > Oracle > Código para convertir de Número a Letras

Código para convertir de Número a Letras

Uno de los proyectos que más piden en las clases de programación en los colegios o universidades es la conversión de números a letras, por algún tiempo me la pasé buscando y encontré varias soluciones en Visual Basic, en C, en PHP, en ASP, en fin, en tantas herramientas, pero en PL/SQL de Oracle !!!   fué casi misión imposible, por lo que aquí les comparto una para quienes les pueda servir, … no hay que inventar el agua azucarada.

— Start of DDL script for NUMTOLETRAS

— Function NUMTOLETRAS

CREATE OR REPLACE
FUNCTION NUMTOLETRAS (Numero Number) RETURN Varchar2 IS
TYPE Textos IS TABLE OF Varchar2(20)
INDEX BY BINARY_INTEGER;
Texto Textos;
Letras Varchar2(255) := »;
I BINARY_INTEGER := 0;
EnTexto Varchar2(255);
Unidad Varchar2(255);
Grupo Varchar2(255);
TextoCentena Varchar2(255);
TextoDecena Varchar2(255);
TextoUnidad Varchar2(255);
Y Varchar2(255);
Decimales Varchar2(255);
DigitoCentena Number;
DigitoDecena Number;
DigitoUnidad Number;

BEGIN
Texto(0) := ‘UN ‘;
Texto(1) := ‘UNO ‘;
Texto(2) := ‘DOS ‘;
Texto(3) := ‘TRES ‘;
Texto(4) := ‘CUATRO ‘;
Texto(5) := ‘CINCO ‘;
Texto(6) := ‘SEIS ‘;
Texto(7) := ‘SIETE ‘;
Texto(8) := ‘OCHO ‘;
Texto(9) := ‘NUEVE ‘;
Texto(10):= ‘DIEZ ‘;
Texto(11):= ‘VEINTE ‘;
Texto(12) := ‘TREINTA ‘;
Texto(13) := ‘CUARENTA ‘;
Texto(14) := ‘CINCUENTA ‘;
Texto(15) := ‘SESENTA ‘;
Texto(16) := ‘SETENTA ‘;
Texto(17) := ‘OCHENTA ‘;
Texto(18) := ‘NOVENTA ‘;
Texto(19) := ‘ONCE ‘;
Texto(20) := ‘DOCE ‘;
Texto(21) := ‘TRECE ‘;
Texto(22) := ‘CATORCE ‘;
Texto(23) := ‘QUINCE ‘;
Texto(24) := ‘CIEN ‘;
Texto(25) := ‘CIENTO ‘;
Texto(26) := ‘DOSCIENTOS ‘;
Texto(27) := ‘TRESCIENTOS ‘;
Texto(28) := ‘CUATROCIENTOS ‘;
Texto(29) := ‘QUINIENTOS ‘;
Texto(30) := ‘SEISCIENTOS ‘;
Texto(31) := ‘SETECIENTOS ‘;
Texto(32) := ‘OCHOCIENTOS ‘;
Texto(33) := ‘NOVECIENTOS ‘;
Texto(34) := ‘MIL ‘;
Texto(35) := ‘MILLON ‘;
Texto(36) := ‘MILLONES ‘;

EnTexto := ltrim(rtrim(TO_CHAR(TRUNC(Numero), ‘99999999999’))); —       ‘ Convirtiendo el numero a un string de 12 posiciones.
EnTexto:=lpad(EnTexto,12,’0’);        — Rellena de 0’s

— Este ciclo recorre el numero de tres en tres posiciones.
FOR I IN 1..4 LOOP
Grupo := SUBSTR(EnTexto, I * 3 – 2, 3);    — Obtiene el grupo de tres digitos segun el contador del ciclo.

— Establece las unidades a usar: «mil» o «millon»
IF I=1 or I=3 THEN
Unidad := Texto(34);
ELSE
If I = 2 THEN
IF TO_NUMBER(Grupo)=1 THEN
Unidad := Texto(35);
ELSE
Unidad:= Texto(36);
END IF;
ELSE
Unidad := »;
END IF;
END IF;

— Si hay un numero el grupo lo evalua, sino sigue con el siguiente grupo.
If TO_NUMBER(Grupo) > 0 Then
If TO_NUMBER(Grupo) = 1 Then   — Por los casos de «mil» o «un millon» se evalua cuando el valor sea 1.
IF I = 2 THEN
TextoUnidad := Texto(0);
ELSE
IF I=4 THEN
TextoUnidad := Texto(1);
ELSE
TextoUnidad := »;
END IF;
END IF;
Letras := Letras || TextoUnidad || Unidad;
ELSE   —                         ‘ Los demas casos que no son 1.
— Se asignan a variables cada digito del grupo de tres.
DigitoCentena := TO_NUMBER(SUBSTR(Grupo, 1, 1));
DigitoDecena  := TO_NUMBER(SUBSTR(Grupo, 2, 1));
DigitoUnidad  := TO_NUMBER(SUBSTR(Grupo, 3, 1));

— Si hay algo en los cientos lo analiza sino lo deja pasar.
If DigitoCentena <> 0 Then
— En el caso que sea 100 le asigna de una vez, sino el texto que le corresponde segun la
— posicion en el vector.
IF Grupo = ‘100’ THEN
TextoCentena := Texto(24);
ELSE
TextoCentena := Texto(24 + DigitoCentena);
END IF;
End If;

— Analiza sino se encuentra entre el 11 y el 15.
If DigitoDecena = 1 And DigitoUnidad >= 1 And DigitoUnidad <= 5 Then
TextoDecena := Texto(18 + DigitoUnidad);
TextoUnidad := NULL;
Y           := NULL;

— Evalua Los demas numeros fuera del 11 al 15.
Else
— Si hay numero en las decenas asigna la posicion correspondiente en el vector.
IF DigitoDecena <> 0 THEN
TextoDecena := Texto(9 + DigitoDecena);
ELSE
TextoDecena := »;
END IF;

— Si hay numero en las unidades asigna la posicion correspondiente en el vector.
IF DigitoUnidad <> 0 THEN
TextoUnidad := Texto(DigitoUnidad);
ELSE
TextoUnidad := »;
END IF;

— Evalua si hay que conectar con «y».
IF DigitoUnidad > 0 AND DigitoDecena > 0 THEN
Y := ‘Y ‘;
ELSE
Y := »;
END IF;
End If;
— Une los textos generados en este grupo y los va agregando al resultado
— de la funcion letras.
Letras := Letras || TextoCentena || TextoDecena || Y || TextoUnidad || Unidad;

END IF;
END IF;

END LOOP;

— Evalua si hay decimales.
IF TRUNC(Numero) = Numero THEN
Decimales := ‘EXACTOS’;
ELSE
Decimales := ‘CON ‘||SUBSTR(TO_CHAR(Numero, ‘99999999999.99’),14,2)  || ‘/00’;
END IF;
— Une los decimales al valor de retorno de la funcion.
Letras := Letras || Decimales;

RETURN Letras;
EXCEPTION
WHEN OTHERS THEN
RETURN ‘NO CONVERTIDO’;
END;
/

— End of DDL script for NUMTOLETRAS

Categorías: Oracle Etiquetas:
  1. WILVER GERARDO
    diciembre 3, 2008 a las 2:19 pm

    me gusta lo de convertir numeros a letras
    sigue adelante

  2. CODE47
    febrero 2, 2010 a las 11:38 am

    Excelente funcion me ayudo mucho, muchas gracias querido amigo

  3. Din
    agosto 11, 2010 a las 4:58 pm

    Muchas gracias. Tambien me ayudó mucho la función, ya que las que hay no traducen bien los numeros, jeje. Gracias!

  4. ALROVI
    octubre 21, 2011 a las 3:36 pm

    ¡¡Excelente código!!, me ayudo mucho!!! Lo más interesante es que, en tan poco código, sin tablas y una sola matriz, se haya podido resolver este tema para PL/SQL, muchas gracias.

  5. jdguillen
    diciembre 20, 2011 a las 9:24 am

    Me agrada mucho querídos amigos que les sirva el código, y espero que les sirva a muchas personas más, es un gusto poder colaborar con la comunidad de desarrolladores, saludos.

  6. junio 5, 2014 a las 9:49 pm

    graciasssss compadreseeeeee

  1. No trackbacks yet.

Deja un comentario