Si lo escribiste con Lazarus, en las opciones de compilación tienes esa configuración estilo "C".
Estás en lo cierto, trabajo analizando los caracteres numéricos uno a uno y recursivamente en grupos.
Este es el código:delphi
unit Literales; interface uses Windows, SysUtils, StrUtils; function ToLiteral(N: String): String; implementation function ToLiteral(N: String): String; function Numeros(N: String): String; const suf: array[0..7]of string=('e','i','ta y ','ta','','to ','ientos ','ientos '); uni: array[0..19]of string=('','uno','dos','tres','cuatro','cinco','seis','siete','ocho','nueve', 'diez','once','doce','trece','catorce','quince','dieciseis','diecisite','dieciocho','diecinueve'); dec: array[2..9]of string=('veint','trein','cuaren','cincuen','sesen','seten','ochen','noven'); cen: array[1..9]of string=('cien','dosc','tresc','cuatroc','quin','seisc','setec','ochoc','noevec'); var tm: String; i: integer; begin for i:= 1 to Length(N) do begin tm:= Numeros(copy(N, i, 3*WORD((i>3)and(i<5))+6*WORD(i>6))); // se copian 0, 3 ó 6 caracteres if i = 1 then // Unidades Result:= uni[ord(N[i])-48] else if (i = 2) and (N[i] = '1') then // Decenas Result:= uni[ord(N[1])-38] else if (i = 2) and (N[i] > '1') then Result:=dec[ord(N[i])-48]+suf[WORD((N[i]='2')and(N[i-1]>'0'))+2*WORD(N[i]>'2')+WORD((N[i]>'2') and(N[i-1]='0'))]+Result else if (i = 3) and(N[i] >= '1')then // Centenas Result:= cen[ord(N[i])-48]+suf[3+WORD(N[i]='1')+WORD((N[i]='1')and(N[i-1]>'0')or(N[i-2]>'0'))+ 3*WORD(N[i]>'1')]+Result else if (i = 4) and (tm = 'uno') then // Millares Result:= 'mil ' + Result else if (i = 4) and (tm <> '') then Result:= tm + ' mil ' + Result else if (i = 7) and (N[i] = '1') then //Millones Result:= 'un millón ' + Result else if (i = 7) and (tm <> '') then Result:= tm + ' millones ' + Result else if (i = 13) and (N[i] = '1') then //Billones Result:= 'un billón ' + Result else if (i = 13) and (tm <> '') then Result:= tm + ' billones ' + Result else if (i = 19) and (N[i] = '1') then //Trillones Result:= 'un trillón ' + Result else if (i = 19) and (tm <> '') then Result:= tm + ' trillones ' + Result; end; Result:= Trim(Result); end; begin Result:= Numeros(ReverseString(N)); if Result = '' then Result:= 'cero'; end; end.
Saludos.
Efectivamente lo escribí en Lazarus y con esas directivas.