Prueba este. También creo que en el foro de Clipper están otros.
No es mío. No recuerdo de donde lo obtuve.
FUNCTION NumLetra(
CIFRA)
LOCAL FINAL, CENTS, NUEVA, TEMPORAL, MILLON
FINAL := ""
IF
CIFRA < 0
FINAL := "IMPOSIBLE: CANTIDAD NEGATIVA"
RETURN(FINAL)
ELSE
CENTS := SUBSTR(STR(
CIFRA, 15, 2), 14, 2)
NUEVA := INT(
CIFRA)
ENDIF
************************
* MILLARES DE MILLON *
************************
TEMPORAL := INT(NUEVA/1000000000)
IF TEMPORAL > 0
FINAL := FINAL + GRP_EXPAND(TEMPORAL) + " MIL "
NUEVA := NUEVA - (TEMPORAL * 1000000000)
ENDIF
**********************
* UNIDADES DE MILLON *
**********************
TEMPORAL := INT(NUEVA/1000000)
DO CASE
CASE NUEVA < 2000000
IF (NUEVA % 1000000) = 0
MILLON := " MILLON DE "
ELSE
MILLON := " MILLON "
ENDIF
CASE NUEVA >= 2000000 .AND. NUEVA < 10000000
IF (NUEVA % 1000000) = 0
MILLON := " MILLONES DE "
ELSE
MILLON := " MILLONES "
ENDIF
CASE NUEVA >= 10000000 .AND. NUEVA < 100000000
IF (NUEVA % 1000000) = 0
MILLON := " MILLONES DE "
ELSE
MILLON := " MILLONES "
ENDIF
CASE NUEVA >= 100000000 .AND. NUEVA < 1000000000
IF (NUEVA % 1000000) = 0
MILLON := " MILLONES DE "
ELSE
MILLON := " MILLONES "
ENDIF
ENDCASE
IF TEMPORAL > 0
FINAL := FINAL + GRP_EXPAND(TEMPORAL) + MILLON
NUEVA := NUEVA - (TEMPORAL * 1000000)
ENDIF
***********************
* MILES *
***********************
TEMPORAL := INT(NUEVA/1000)
IF TEMPORAL > 0
FINAL := FINAL + GRP_EXPAND(TEMPORAL) + " MIL "
NUEVA := NUEVA - (TEMPORAL * 1000)
ENDIF
TEMPORAL := NUEVA
*******************
* UNIDADES *
*******************
IF TEMPORAL > 0
FINAL := FINAL + GRP_EXPAND(TEMPORAL)
ENDIF
IF SUBSTR(FINAL,1,2) = "UN" .AND. LEN(FINAL) = 2
** FINAL := FINAL +" "+ MONED +" CON " + CENTS +"/100"
FINAL := FINAL +" CON " + CENTS +"/100"
ELSE
** FINAL := FINAL +" "+ MONEDA+" CON " + CENTS +"/100"
FINAL := FINAL +" CON " + CENTS +"/100"
ENDIF
RETURN(FINAL)
********************
FUNCTION GRP_EXPAND(GRUPO_VAL)
LOCAL ONE_UNIT, TEN_UNIT, CEN_UNIT, GRUPO_STR, NUEVA1
ONE_UNIT := "UN DOS TRES CUATRO CINCO "
ONE_UNIT := ONE_UNIT+"SEIS SIETE OCHO NUEVE DIEZ "
ONE_UNIT := ONE_UNIT+"ONCE DOCE TRECE CATORCE QUINCE "
ONE_UNIT := ONE_UNIT+"DIECISEIS DIECISIETE DIECIOCHO DIECINUEVE VEINTE "
ONE_UNIT := ONE_UNIT+"VEINTIUN VEINTIDOS VEINTITRES VEINTICUATRO"
ONE_UNIT := ONE_UNIT+"VEINTICINCO VEINTISEIS VEINTISIETE VEINTIOCHO "
ONE_UNIT := ONE_UNIT+"VEINTINUEVE "
TEN_UNIT := " TREINTA CUARENTA CINCUENTASESENTA "
TEN_UNIT := TEN_UNIT+"SETENTA OCHENTA NOVENTA "
CEN_UNIT := "CIENTO DOSCIENTOS TRESCIENTOS CUATROCIENTOS"
CEN_UNIT := CEN_UNIT+ "QUINIENTOS SEISCIENTOS SETECIENTOS "
CEN_UNIT := CEN_UNIT+ "OCHOCIENTOS NOVECIENTOS "
GRUPO_STR := ""
IF GRUPO_VAL = 100
NUEVA1 := INT(GRUPO_VAL/100)
GRUPO_VAL := GRUPO_VAL - (NUEVA1 * 100)
GRUPO_STR := GRUPO_STR + " CIEN"
ENDIF
IF GRUPO_VAL > 100
NUEVA1 := INT(GRUPO_VAL/100)
GRUPO_STR := GRUPO_STR + TRIM(SUBSTR(CEN_UNIT, (NUEVA1 *13)-12,13))
GRUPO_VAL := GRUPO_VAL - (NUEVA1 * 100)
GRUPO_STR := GRUPO_STR + " "
ENDIF
IF GRUPO_VAL > 29
NUEVA1 := INT(GRUPO_VAL/10)-1
GRUPO_STR := GRUPO_STR + TRIM(SUBSTR(TEN_UNIT,(NUEVA1*9)-8,9))
NUEVA1 := INT(GRUPO_VAL/10)*10
GRUPO_VAL := GRUPO_VAL - NUEVA1
IF GRUPO_VAL > 0
GRUPO_STR := GRUPO_STR + " Y "
ENDIF
ENDIF
IF GRUPO_VAL > 0
GRUPO_STR := GRUPO_STR + TRIM(SUBSTR(ONE_UNIT,(GRUPO_VAL*12)-11,12))
ENDIF
RETURN(GRUPO_STR)
Saludos.