Newsgroup: it.comp.lang.vo-clipper
Titolo: numeri e lettere - euro

vecchia funzione modificata brevemente, provatela perň.
i test che ho fatto io sono andati bene, ma non si sa mai.
quando era in lire non mi ha mai dato problemi.
l'originale lire non l'ho scritta io.
ciao
antonio calogiuri
www.calogiuri.com
FUNCTION cNUMLET(imp_ort)
* conversione da cifre in lettere
* nuova versione per euro: es. 32,25 diventa trentadue/25
LOCAL nume AS FLOAT
LOCAL gruppo,cifra AS WORD
LOCAL unita,decina1,decine,attributi,parole,stringa,tre_cifre,cifre AS
STRING
LOCAL nParteIntera AS FLOAT
LOCAL cParteDecimale AS STRING
 nParteintera:=Integer(imp_ort)
 cParteDecimale:="/"+Right( Str(Frac(imp_ort),-1, 2) ,2)
 nume:=nParteintera
 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 č 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+cParteDecimale

Aggiungo anche la mia rivista e corretta per l'euro :
 FUNCTION Num2LetterEURO( Imp_ort AS  USUAL )
  LOCAL unita,decina1,decine,attributi AS STRING
 LOCAL cifre,parole,stringa,tre_cifre AS STRING
    LOCAL cifra,Gruppo AS LONGINT
    LOCAL Nume AS USUAL
  LOCAL cParteDecimale AS STRING
         /*    Questa funzione converte delle cifre in lettere
           Parametri :
           Imp_ort := cifra da convertire (puo essere di tipo carattere o
numerico)
           NOTA : cifra massima convertibile = 999.999.999.999
         */
         *   Converto il tipo di dato del parametro
 IF ValType(imp_ort) == "C"
        nume := Integer(Val(imp_ort))
   cParteDecimale:="/"+Right(imp_ort,2)
    ELSEIF ValType(imp_ort) == "N"
        nume := Integer(imp_ort)
   cParteDecimale:="/"+Right( Str(Frac(imp_ort),-1, 2) ,2)
    ENDIF
* 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
   * filtraggio 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
              * filtraggio 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




                   ELSE





           IF Len(stringa)#0
              parole := stringa+parole
           ENDIF
           * decremento dell'indice del ciclo
           gruppo := gruppo-1
     ENDDO
ENDCASE
RETURN(parole+cParteDecimale)
Enio

l'originale lire non l'ho scritta io.
Ciao e buon anno a tutti.
Mi pare di capire che queste due funzioni, sia quella di Antonio che
di Enio siano state scritte per VO.
Traducendole in clipper, quale funzione e' corretto usare al posto di
Integer e quale al posto di Frac ?
Lo chiedo visti tutti i problemi di arrotondamenti ecc di cui si e'
discusso negli ultimi tempi.
Ciao.Alberto.
-------------------------------------------------------------
Alberto Rubinelli           Mail : 
alb...@retrocomputing.net
A2 SISTEMI                  Http : 
www.retrocomputing.net
Via Costantino Perazzi 22   Tel 0321 640149
28100 NOVARA (NO) - ITALY   Fax 0321 391769
ICQ : 49872318              Odigo : 5269083