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.