Newsgroup: it.comp.lang.vo-clipper
Titolo: ROUND2

Dopo aver seguito l'interessante discussione
sugli aspetti della funzione ROUND, propongo come
contributo una mia versione della ROUND2, basata
sull' ultima versione di EMG senza operazioni :
Provatela e fatemi sapere !!
Paolo Ramozzi
paolo....@soft.com.it
www.soft-com.it
FUNCTION ROUND2(fVal,nDec)
LOCAL sVal,kPos,nRet := 0
   IF nDec < 0
      sVal := LTRIM(STR(INT(fVal)))
      kPos := LEN(sVal)-ABS(nDec)+1
      IF kPos > 0
         nRet := M_ROUND2(sVal,kPos)
      ENDIF
   ELSE
      sVal := LTRIM(STR(fVal))
      kPos := AT(".",sVal)
      IF (kPos == 0)
         sVal += "."+REPLICATE("0",nDec+1)
      ELSE
         sVal += REPLICATE("0",nDec+1)
         sVal := LEFT(sVal,kPos+nDec+1)
      ENDIF
      kPos := LEN(sVal)
      nRet := M_ROUND2(sVal,kPos)
   ENDIF
RETURN nRet
STATIC FUNCTION M_ROUND2(sVal,kPos)
LOCAL k,sChar,sLen,lInc,sRet := ""
   sLen := LEN(sVal)
   IF AT(".",sVal) == 0
      sRet := REPLICATE("0",sLen-kPos+1)
   ENDIF
   sChar := SUBSTR(sVal,kPos,1)
   lInc := (sChar > "4")
   FOR k := kPos-1 TO 1 STEP -1
      sChar := SUBSTR(sVal,k,1)
      IF sChar == "."
         sRet := "."+sRet
      ELSE
         IF lInc
            sChar := CHR(ASC(sChar)+1)
            IF sChar > "9"
               sChar := "0"
            ENDIF
            lInc := (sChar == "0")
         ENDIF
         sRet := sChar+sRet
      ENDIF
   NEXT j
   IF lInc
      sRet := "1"+sRet
   ENDIF
RETURN VAL(sRet)

Scusate ma nella fretta ho completamente
dimenticato i numeri negativi !!
Ecco la versione corretta, spero -:)
Paolo Ramozzi
paolo....@soft.com.it
www.soft-com.it
FUNCTION ROUND2(fVal,nDec)
LOCAL sVal,kPos,isNeg,nRet := 0
   isNeg := fVal < 0
   fVal := ABS(fVal)
   IF nDec < 0
      sVal := LTRIM(STR(INT(fVal)))
      kPos := LEN(sVal)-ABS(nDec)+1
      IF kPos > 0
         nRet := M_ROUND2(sVal,kPos)
      ENDIF
   ELSE
      sVal := LTRIM(STR(fVal))
      kPos := AT(".",sVal)
      IF (kPos == 0)
         sVal += "."+REPLICATE("0",nDec+1)
      ELSE
         sVal += REPLICATE("0",nDec+1)
         sVal := LEFT(sVal,kPos+nDec+1)
      ENDIF
      kPos := LEN(sVal)
      nRet := M_ROUND2(sVal,kPos)
   ENDIF
RETURN nRet*IIF(isNeg,-1,1)


 Provatela e fatemi sapere !!
Niente da fare, ha problemi negli allineamenti. Interrompo, per ora, i
controlli sul nascere:
? ROUNDPR( 4, 0 ) ==> 4 (ma allineato al margine sinistro)
EMG
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 Ecco la versione corretta, spero -:)
Ora sembra andare bene. Ha superato tutti i miei tests (che perņ non
sono esaustivi), anche per quanto riguarda gli allineamenti. Vediamo
come si comporta riguardo la velocitą... uhm... un po' lenta,
praticamente ci mette il doppio della mia versione. Considerando che
servirą come riferimento per i tests (ma che, chissą, potrebbe anche
essere utilizzata come sostituta della ROUND() originale) sarebbe meglio
ottimizzarla un po'.



Ok Enrico,
se non escono errori posso provare durante
il weekend a limarla un pochino per la velocità.
Magari posso anche provare a scrivere la funzione
M_ROUND2 in C.
Ciao. fammi sapere
Paolo R.
paolo....@soft-com.it
www.soft-com.it

 M_ROUND2 in C.
Sarebbe interessante.
