>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 >I think your function could be shorten by the following and round grade could be what ever multiple you want.
Function nround(tlnvalue, tlnround, tnMode) If Vartype(tnMode) # "N" Or !Inlist(tnMode,0,1) tnMode = 0 Endif *!* tlnvalue = Value to round *!* tlnround = round grade *!* tnMode = type of round *!* tnMode = 1 always up to the nearest *!* tnMode = 0 with normal rounding rules IF tnMode = 0 *-- Just round lnRetVal = ROUND(tlnvalue/tlnround,0) * tlnround ELSE *-- Always round up lnRetVal = CEILING(tlnvalue/tlnround) * tlnround ENDIF Return lnRetVal Endfunc