Newsgroup: it.comp.lang.vo-clipper
Titolo: NUMERI->STRINGHE

Salve a tutti,
ho unprogramma in clipper summer '87.
Come posso trasformare un munero intero nella striga che rappresenta il
numero stesso?
es.
numero ->20000
come posso ricavare la stringa "ventimila"?
Il problema nasce quando si devono stampare bollettini di conto corrente 
postali.
Grazie.

eccotela ( è buona a nche per VO !!!)
*------------------------------------------------------------
*  Funzione per trasformare i numeri in lettere
*------------------------------------------------------------
FUNCTION NUMLET
PARAMETERS imp_ort
*-----------------
PRIVATE nume,unita,decina1,decine,attributi
PRIVATE cifre,parole,gruppo,stringa,tre_cifre
*--------------------------------------------
nume = imp_ort
* impostazione variabili di memoria
unita     = "uno    due    tre    quattrocinque sei    sette  otto   nove
"
decina1   = "dieci      undici     dodici     tredici    quattordici"+;
            "quindici   sedici     diciassettediciotto   diciannove "
decine    = "dieci    venti    trenta   quaranta cinquantasessanta "+;
            "settanta ottanta  novanta  "
attributi = "miliardimilioni mila    "
DO CASE
   * filtrazione dei casi particolari (valori 0 e 1)
   CASE nume=0
        parole = "zero"
   * conversione generalizzata del numero
   OTHERWISE
   * conversione da numero a caratteri
        cifre = STR(ABS(nume),12,0)
        parole = ""
   * ciclo di analisi dei 4 gruppi di 3 cifre ciascuno, da destra verso
   * sinistra; il gruppo 1 S quello dei miliardi
        gruppo = 4
        DO WHILE gruppo#0
           * estrazione delle tre cifre del gruppo
           tre_cifre = SUBSTR(cifre,(gruppo-1)*3+1,3)
           stringa = ""
           DO CASE
              * verifica della condizione di fine ciclo prematura
              CASE tre_cifre=SPACE(3)
                   EXIT
              * filtrazione del caso anomalo di valore del gruppo uguale a 1
              CASE VAL(tre_cifre)=1
                   DO CASE
                      CASE gruppo=4
                           stringa = "uno"
                      CASE gruppo=3
                           stringa = "mille"
                      CASE gruppo=2
                           stringa = "unmilione"
                      CASE gruppo=1
                           stringa = "unmiliardo"
                   ENDCASE
              * conversione generalizzata del valore del gruppo diverso da 0
              CASE VAL(tre_cifre)>1
                   * analisi della prima cifra a sinistra (centinaia)
                   cifra = VAL(SUBSTR(tre_cifre,1,1))
                   IF cifra#0
                      IF cifra>1
                         stringa = TRIM(SUBSTR(unita,(cifra-1)*7+1,7))
                      ENDIF
                      stringa = stringa+"cento"
                      * controllo dell'eccezione "CENTOOTTANTA"
                      IF SUBSTR(tre_cifre,2,1)="8"
                         stringa = LEFT(stringa,LEN(stringa)-1)
                      ENDIF
                   ENDIF
                   * analisi della cifra centrale (decine)
                   cifra = VAL(SUBSTR(tre_cifre,2,1))
                   IF cifra=1
                      * caso della prima decina
                      cifra = VAL(SUBSTR(tre_cifre,3,1))
                      stringa = stringa+TRIM(SUBSTR(decina1,cifra*11+1,11))
                   ELSE
                      * caso della decine successive alla prima
                      IF cifra>1
                         stringa =
stringa+TRIM(SUBSTR(decine,(cifra-1)*9+1,9))
                         * controllo delle eccezioni del tipo "VENTIUNO" e
"VENTIOTTO"
                         IF SUBSTR(tre_cifre,3,1)$"18"
                            stringa = LEFT(stringa,LEN(stringa)-1)
                         ENDIF
                      ENDIF
                      * analisi dell'ultima cifra a destra (unit.)
                      cifra = VAL(SUBSTR(tre_cifre,3,1))
                      IF cifra>0
                         stringa =
stringa+TRIM(SUBSTR(unita,(cifra-1)*7+1,7))
                      ENDIF
                   ENDIF
                   * aggiunta dell'attributo del gruppo (miliardi, milioni,
                   * mila); il primo a destra deve essere escluso
                   IF gruppo#4
                      stringa =
stringa+TRIM(SUBSTR(attributi,(gruppo-1)*8+1,8))
                   ENDIF
           ENDCASE
           * composizione dei gruppi convertiti, con esclusione del valore 0
           IF LEN(stringa)#0
              parole = stringa+parole
           ENDIF
           * decremento dell'indice del ciclo
           gruppo = gruppo-1
     ENDDO
ENDCASE
RETURN(parole)

 numero stesso?
Ho queste funzioni scritte qualche anno fa in Clipper 5. Vedi un po' se
puoi ricavarne qualcosa.
FUNCTION MAIN()
    ? NTOW( 123456789 )
    RETURN NIL
FUNCTION NTOW( nNumero )
    LOCAL cRisult := ""
    LOCAL cNumero, cTemp
    IF nNumero = 0
        RETURN "ZERO"
    ENDIF
    cNumero = STRZERO( nNumero, 12 )
    cTemp = TRIPLA( LEFT( cNumero, 3 ) )
    DO CASE
        CASE cTemp = "ZERO"
        CASE cTemp = "UNO"
            cRisult += "UNMILIARDO"
        OTHERWISE
            cRisult += cTemp + "MILIARDI"
    ENDCASE
    cTemp = TRIPLA( SUBSTR( cNumero, 4, 3 ) )
    DO CASE
        CASE cTemp = "ZERO"
        CASE cTemp = "UNO"
            cRisult += "UNMILIONE"
        OTHERWISE
            cRisult += cTemp + "MILIONI"
    ENDCASE
    cTemp = TRIPLA( SUBSTR( cNumero, 7, 3 ) )
    DO CASE
        CASE cTemp = "ZERO"
        CASE cTemp = "UNO"
            cRisult += "MILLE"
        OTHERWISE
            cRisult += cTemp + "MILA"
    ENDCASE
    cTemp = TRIPLA( SUBSTR( cNumero, 10, 3 ) )
    DO CASE
        CASE cTemp = "ZERO"
        OTHERWISE
            cRisult += cTemp
    ENDCASE
    RETURN cRisult
STATIC FUNCTION TRIPLA( cTripla )
    LOCAL cRisult := ""
    LOCAL cCifra
    IF cTripla = "000"
        RETURN "ZERO"
    ENDIF
    cCifra = LEFT( cTripla, 1 )
    IF cCifra != "0"
        DO CASE
            CASE cCifra = "1"
            CASE cCifra = "2"
                cRisult += "DUE"
            CASE cCifra = "3"
                cRisult += "TRE"
            CASE cCifra = "4"
                cRisult += "QUATTRO"
            CASE cCifra = "5"
                cRisult += "CINQUE"
            CASE cCifra = "6"
                cRisult += "SEI"
            CASE cCifra = "7"
                cRisult += "SETTE"
            CASE cCifra = "8"
                cRisult += "OTTO"
            CASE cCifra = "9"
                cRisult += "NOVE"
        ENDCASE
        cRisult += "CENTO"
    ENDIF
    cCifra = SUBSTR( cTripla, 2, 1 )
    IF cCifra != "0"
        DO CASE
            CASE cCifra = "1"
                cCifra = RIGHT( cTripla, 1 )
                DO CASE
                    CASE cCifra = "0"
                        cRisult += "DIECI"
                    CASE cCifra = "1"
                        cRisult += "UNDICI"
                    CASE cCifra = "2"
                        cRisult += "DODICI"
                    CASE cCifra = "3"
                        cRisult += "TREDICI"
                    CASE cCifra = "4"
                        cRisult += "QUATTORDICI"
                    CASE cCifra = "5"
                        cRisult += "QUINDICI"
                    CASE cCifra = "6"
                        cRisult += "SEDICI"
                    CASE cCifra = "7"
                        cRisult += "DICIASSETTE"
                    CASE cCifra = "8"
                        cRisult += "DICIOTTO"
                    CASE cCifra = "9"
                        cRisult += "DICIANNOVE"
                ENDCASE
                RETURN cRisult
            CASE cCifra = "2"
                cRisult += "VENTI"
            CASE cCifra = "3"
                cRisult += "TRENTA"
            CASE cCifra = "4"
                cRisult += "QUARANTA"
            CASE cCifra = "5"
                cRisult += "CINQUANTA"
            CASE cCifra = "6"
                cRisult += "SESSANTA"
            CASE cCifra = "7"
                cRisult += "SETTANTA"
            CASE cCifra = "8"
                cRisult += "OTTANTA"
            CASE cCifra = "9"
                cRisult += "NOVANTA"
        ENDCASE
    ENDIF
    cCifra = RIGHT( cTripla, 1 )
    IF cCifra != "0"
        DO CASE
            CASE cCifra = "1"
                IF SUBSTR( cTripla, 2, 1 ) = "0"
                    cRisult += "UNO"
                ELSE
                    cRisult = SUBSTR( cRisult, 1, LEN( cRisult ) - 1 ) +
"UNO"
                ENDIF
            CASE cCifra = "2"
                cRisult += "DUE"
            CASE cCifra = "3"
                cRisult += "TRE"
            CASE cCifra = "4"
                cRisult += "QUATTRO"
            CASE cCifra = "5"
                cRisult += "CINQUE"
            CASE cCifra = "6"
                cRisult += "SEI"
            CASE cCifra = "7"
                cRisult += "SETTE"
            CASE cCifra = "8"
                IF SUBSTR( cTripla, 2, 1 ) = "0"
                    cRisult += "OTTO"
                ELSE
                    cRisult = SUBSTR( cRisult, 1, LEN( cRisult ) - 1 ) +
"OTTO"
                ENDIF
            CASE cCifra = "9"
                cRisult += "NOVE"
        ENDCASE
    ENDIF
    RETURN cRisult
EMG