Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Rounding Help Needed
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Divers
Thread ID:
00861734
Message ID:
00861776
Vues:
21
Why not to use "global" rounding function. With this you can define the rounding grade and if the value should be rounded with normal rounding rules or up to the nearest (f.ex 21.85 -> 25.00 you shoud call
?nRound(21.85,5.0,1)

AT

P.S. Be careful to use right ratio between tlnvalue and tlnround (tlnround shoud be same magnitude or lesser than tlnvalue).
Function nround(tlnvalue, tlnround, tnMode)

  If Vartype(tnMode) # "N" Or !Inlist(tnMode,0,1)
    tnMode = 0
  Endif

  *!* tlnvalue = Value to round
  *!* tlnround = round grade (0.01 0.1 0.5 1.0 5.0 10.0 50.0 100.0 500.0 1000.0)
  *!* tnMode = type of round
  *!* tnMode = 1 always up to the nearest
  *!* tnMode = 0 with normal rounding rules

  Local ;
    lnRetVal, ;
    lnj, ;
    lnk

  Do Case
    Case tlnround = 0.01 && 0.01
      lnRetVal = Round(tlnvalue,2)
    Case tlnround = 0.1 && 0.1
      lnRetVal = Round(tlnvalue,1)
    Case tlnround = 0.5 && 0.5
      lnj = Round(tlnvalue,1)
      lnk = Abs(Int(tlnvalue) - Round(tlnvalue,1))
      Do Case
        Case lnk>= 0 And lnk<0.3
          lnk = 0
        Case lnk> 0.2 And lnk<0.8
          lnk = 0.5

        Case lnk> 0.7 And lnk<1
          lnk = 1
      Endcase

      lnRetVal = Round(Int(tlnvalue) + lnk,2)

    Case tlnround = 1.0 && 1.0
      lnRetVal = Round(tlnvalue,0)

    Case tlnround = 5.0 &&  5.0
      lnj = Round(tlnvalue,0)
      lnj = lnj/10
      lnk = Abs(Int(lnj) - lnj)
      Do Case
        Case lnk>= 0 And lnk<0.3
          lnk = 0
        Case lnk> 0.2 And lnk<0.8
          lnk = 0.5

        Case lnk> 0.7 And lnk<1
          lnk = 1
      Endcase

      lnRetVal = 10*Round(Int(lnj) + lnk,2)

    Case tlnround = 10.0 && 10.0
      lnRetVal = Round(tlnvalue,-2)

    Case tlnround = 50.0 && 50.0
      lnj = Round(tlnvalue,-1)
      lnj = lnj/100
      lnk = Abs(Int(lnj) - lnj)
      Do Case
        Case lnk>= 0 And lnk<0.3
          lnk = 0
        Case lnk> 0.2 And lnk<0.8
          lnk = 0.5

        Case lnk> 0.7 And lnk<1
          lnk = 1
      Endcase

      lnRetVal = 100*Round(Int(lnj) + lnk,2)


    Case tlnround = 100.0 && 100.0
      lnRetVal = Round(tlnvalue,-3)

    Case tlnround = 500.0 && 500.0
      lnj = Round(tlnvalue,-2)
      lnj = lnj/1000
      lnk = Abs(Int(lnj) - lnj)
      Do Case
        Case lnk>= 0 And lnk<0.3
          lnk = 0
        Case lnk> 0.2 And lnk<0.8
          lnk = 0.5

        Case lnk> 0.7 And lnk<1
          lnk = 1
      Endcase

      lnRetVal = 1000*Round(Int(lnj) + lnk,2)


    Case tlnround = 1000.0 && 1000.0
      lnRetVal = Round(tlnvalue,-4)

    Otherwise
      lnRetVal = tlnvalue
  Endcase

  lnRetVal = lnRetVal+Iif(tnMode=0,0,Iif(tlnvalue>lnRetVal,tlnround,0))

  Return lnRetVal

Endfunc
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform