WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

Formatting UDFs

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Format Number UDF


See also: Number Conversion - Format Numbers with Commas - Using MSScriptControl

; UDF - Format Number
; 01/12/2006 R. Presser (Odyssey Data Systems, Inc.)
;
; Returns a string variable formatted according to parameters passed to this function.
; Can be used to insert commas, decimal point, leading or trailing minus sign, etc.
;---------------------------------------------------------------------

#DefineFunction odsFormatNumber (NumVar, FmtCols, NumDecs, Sign, DecChar, ThousChar, FloatCurSym)
; NumVar Variable that contains a number to be formatted

; FmtCols Number of columns (width) of newly formatted number (output will be right-adjusted to this width)
; Note - right-alignment works best if numbers are displayed in a fixed-pitch font
; such as Courier
; Any numeric value
; Defaults to actual width

; NumDecs A number from 0 to 9 indicating how many decimals to return (default = 2)
; Sign A code that describes how to handle negative values
; L = Left - minus sign preceeds number, if negative (default) -123456.78
; R = Right - minus sign follows number, if negative 123456.78-
; N = None - no sign returned, even if negative 123456.78
; P = Parens - negative numbers are surrounded by parenthis(123,456.78)
; C = CR/DR - sign of CD (minus) or DR (plus) always follows 123456.78CR

; DecChar A code indicating what character to use as the decimal
; . = A period (default)
; , = A comma
; N = No decimal is returned

; ThousChar A code indicating what character to use as a thousands seperator
; , = A comma (default)
; . = A period
; N = No thousands seperator is used

; FloatCurSym A code indicating whether or not to return a floating
currency symbol
; N = No currency symbol is returned (default)
; Any special character
; such as $

;---------------------------------------------------------------------


; Setup variables
SignVals = 'LRNPC'
DecCharVals = '.,N'
ThousCharVals = ',.N'
NumDecsVals = '0123456789'

WorkString = ''
FormattedString = ''
NumPadDecs = 0
ThousPosn = 0

; Set defaults
If FmtCols == ' ' Then FmtCols = 0
If Sign == ' ' Then Sign = 'L'
If DecChar == ' ' Then DecChar = '.'
If ThousChar == ' ' Then ThousChar = ','
If NumDecs == ' ' Then Numdecs = 2
If FloatCurSym == ' ' Then FloatCurSym = 'N'

; Edit parameters
If IsNumber(NumVar) == @FALSE
   Message('Error', 'NumVar parameter does not contain a valid number')
   Return @FALSE
EndIf

If IsNumber(FmtCols) == @FALSE
   Message('Error', 'FmtCols parameter does not contain a valid number')
   Return @FALSE
EndIf

Sign = StrUpper(Sign)
DecChar = StrUpper(DecChar)
ThousChar = StrUpper(ThousChar)
FloatCurSym = StrUpper(FloatCurSym)

If StrIndex(SignVals, Sign, 1, @FWDSCAN) == 0
   Message('Error', 'Sign parameter is not L, R, N, P or C')
   Return @FALSE
EndIf

If StrIndex(DecCharVals, DecChar, 1, @FWDSCAN) == 0
   Message('Error', 'DecChar parameter is not a period, comma or N')
   Return @FALSE
EndIf

If StrIndex(ThousCharVals, ThousChar, 1, @FWDSCAN) == 0
   Message('Error', 'ThousChar parameter is not a comma, period or N')
   Return @FALSE
EndIf

If StrIndex(NumDecsVals, NumDecs, 1, @FWDSCAN) == 0
   Message('Error', 'NumDecs parameter is not 0 through 9')
   Return @FALSE
EndIf

; Main processing (no errors detected)

NumLen  = StrLen(NumVar) ;Determine length of number

DecPosn = StrIndex(NumVar, '.', 1, @FWDSCAN) ;Determine position of decimal, if any

NegVal  = @FALSE ;Determine is number is negative
If NumVar < 0
   NegVal = @TRUE
EndIf

; Build work string in reverse order
; Build final sign, symbol or space
If NegVal == @TRUE
   If Sign == 'R'
      WorkString = StrCat(WorkString, '-')
   EndIf
   If Sign == 'P'
      WorkString = StrCat(WorkString, ')')
   EndIf
   If Sign == 'C'
      WorkString = StrCat(WorkString, 'RC')
   EndIf
Else
   If Sign == 'R'
      WorkString = StrCat(WorkString, ' ')
   EndIf
   If Sign == 'P'
      WorkString = StrCat(WorkString, ' ')
   EndIf
   If Sign == 'C'
      WorkString = StrCat(WorkString, 'RD')
   EndIf
EndIf

; Pad number of decimals, if necessary
If DecPosn == 0
   WorkString = StrCat(WorkString, StrFill('0', NumDecs))
   WorkString = StrCat(WorkString, DecChar)
EndIf
If DecPosn > 0
   ActNumDecs = NumLen - DecPosn
   If ActNumDecs < NumDecs
      NumPadDecs = NumDecs - ActNumDecs
      WorkString = StrCat(WorkString, StrFill('0', NumPadDecs))
   EndIf
   StartPosn = DecPosn + NumDecs
Else
   StartPosn = NumLen
EndIf

; Loop through NumVar in reverse order
For I = Startposn To 1 By -1
   SingleChar = StrSub(NumVar, I, 1)
   If IsNumber(SingleChar) == @TRUE
      If DecPosn == 0 || I < DecPosn
         If ThousChar <> 'N'
            ThousPosn = ThousPosn + 1
            If ThousPosn == 4
               WorkString = StrCat(WorkString, ThousChar)
               ThousPosn = 1
            EndIf
         EndIf
      EndIf
      WorkString = StrCat(WorkString, SingleChar)
   EndIf
   If SingleChar == '.'
      If DecChar <> 'N'
         WorkString = StrCat(WorkString, DecChar)
      EndIf
   EndIf
   If SingleChar == '-' ;Skip
   EndIf
Next

; Add leading sign, if any
If NegVal == @TRUE
   If Sign == 'P'
      WorkString = StrCat(WorkString, '(')
   EndIf
   If Sign == 'L'
      WorkString = StrCat(WorkString, '-')
   EndIf
EndIf

; Add leading floating currency symbol, if any
If FloatCurSym <> 'N'
   WorkString = StrCat(WorkString, FloatCurSym)
EndIf

; Reverse work string
WorkStringLen = StrLen(WorkString)
For I = WorkStringLen To 1 By -1
   SingleChar = StrSub(WorkString, I, 1)
   FormattedString = StrCat(FormattedString, SingleChar)
Next

; Right-adjust formatted string in defined width, if any
If FmtCols > 0
   FmtFill = FmtCols - StrLen(FormattedString)
   If FmtFill > 0
      FormattedString = StrCat(StrFill(' ', FmtFill), FormattedString)
   EndIf
EndIf

Return FormattedString
#EndFunction
;
;---------------------------------------------------------------------

; Test call to UDF
; Set initial defaults for dialog box variables
tNumVar = 0
tFmtCols = 0
tSign = 1
tDecChar = 1
tThousChar = 1
tNumDecs = '2'
tFloatCurSym= 'N'
Loop = @TRUE

While Loop == @TRUE
   GoSub InputRoutine

   Select tSign
      Case 1
         Sign = 'L'
         Break
      Case 2
         Sign = 'R'
         Break
      Case 3
         Sign = 'N'
         Break
      Case 4
         Sign = 'P'
         Break
      Case 5
         Sign = 'C'
         Break
   EndSelect

   Select tDecChar
      Case 1
         DecChar = '.'
         Break
      Case 2
         DecChar = ','
         Break
      Case 3
         DecChar = 'N'
         Break
   EndSelect

   Select tThousChar
      Case 1
         ThousChar = ','
         Break
      Case 2
         ThousChar = '.'
         Break
      Case 3
         ThousChar = 'N'
         Break
   EndSelect

   FormattedNumber = odsFormatNumber(tNumVar, tFmtCols, tNumDecs, Sign, DecChar, ThousChar, tFloatCurSym)
   tFormattedString = StrCat(tFormattedString, @CRLF, FormattedNumber)

EndWhile

;---------------------------------------------------------------------

:InputRoutine
MyDialogFormat=`WWWDLGED,6.1`

MyDialogCaption=`Understanding odsFormatNumber UDF`
MyDialogX=002
MyDialogY=061
MyDialogWidth=364
MyDialogHeight=202
MyDialogNumControls=030
MyDialogProcedure=`DEFAULT`
MyDialogFont=`DEFAULT`
MyDialogTextColor=`DEFAULT`
MyDialogBackground=`DEFAULT,DEFAULT`
MyDialogConfig=0

MyDialog001=`077,175,036,012,PUSHBUTTON,DEFAULT,"OK",1,1,32,DEFAULT,DEFAULT,DEFAULT`
MyDialog002=`149,175,036,012,PUSHBUTTON,DEFAULT,"Cancel",0,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog003=`077,027,068,012,EDITBOX,tNumVar,"NumVar",DEFAULT,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog004=`013,027,044,012,STATICTEXT,DEFAULT,"NumVar:",DEFAULT,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog005=`013,049,044,012,STATICTEXT,DEFAULT,"FmtCols:",DEFAULT,5,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog006=`077,049,036,012,EDITBOX,tFmtCols,"FmtCols",DEFAULT,6,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog007=`077,089,024,012,RADIOBUTTON,tSign,"Left",1,7,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog008=`109,089,028,012,RADIOBUTTON,tSign,"Right",2,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog009=`145,089,028,012,RADIOBUTTON,tSign,"None",3,9,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog010=`179,089,030,012,RADIOBUTTON,tSign,"Parens",4,10,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog011=`215,089,028,012,RADIOBUTTON,tSign,"CR/DR",5,11,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog012=`013,089,044,012,STATICTEXT,DEFAULT,"Sign:",DEFAULT,12,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog013=`013,109,044,012,STATICTEXT,DEFAULT,"DecChar:",DEFAULT,13,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog014=`013,129,044,012,STATICTEXT,DEFAULT,"ThousChar:",DEFAULT,14,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog015=`013,069,044,012,STATICTEXT,DEFAULT,"NumDecs:",DEFAULT,15,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog016=`013,149,044,012,STATICTEXT,DEFAULT,"FloatCurSym:",DEFAULT,16,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog017=`077,107,026,012,RADIOBUTTON,tDecChar,"Period",1,17,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog018=`109,107,032,012,RADIOBUTTON,tDecChar,"Comma",2,18,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog019=`145,107,032,012,RADIOBUTTON,tDecChar,"None",3,19,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog020=`077,127,030,012,RADIOBUTTON,tThousChar,"Comma",1,20,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog021=`109,127,032,012,RADIOBUTTON,tThousChar,"Period",2,21,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog022=`145,127,030,012,RADIOBUTTON,tThousChar,"None",3,22,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog023=`077,069,018,012,EDITBOX,tNumDecs,"2",DEFAULT,23,64,DEFAULT,DEFAULT,DEFAULT`
MyDialog024=`077,149,018,012,EDITBOX,tFloatCurSym,"$",DEFAULT,24,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog025=`267,037,074,120,VARYTEXT,tFormattedString,DEFAULT,DEFAULT,25,DEFAULT,"Courier New|5632|70|49","0|0|0",DEFAULT`
MyDialog026=`265,027,078,132,GROUPBOX,DEFAULT,"Results",DEFAULT,27,DEFAULT,DEFAULT,DEFAULT,DEFAULT`
MyDialog027=`119,049,118,016,STATICTEXT,DEFAULT,"<--  Right-align output in this number of columns.          (Zero means align left.)",DEFAULT,26,DEFAULT,"Microsoft Sans Serif|5632|40|34","0|0|128",DEFAULT`
MyDialog028=`119,069,132,012,STATICTEXT,DEFAULT,"<--  Truncate or pad output to this number of decimals",DEFAULT,26,DEFAULT,"Microsoft Sans Serif|5632|40|34","0|0|128",DEFAULT`
MyDialog029=`119,149,132,012,STATICTEXT,DEFAULT,"<--  Any single character ($), or N for None",DEFAULT,26,DEFAULT,"Microsoft Sans Serif|5632|40|34","0|0|128",DEFAULT`
MyDialog030=`025,009,306,012,STATICTEXT,DEFAULT,"Accept or change any variable(s) below, then click OK.  Result(s) will appear in column on the right.",DEFAULT,30,512,"Microsoft Sans Serif|5632|70|34","0|0|128",DEFAULT`

ButtonPushed=Dialog("MyDialog")

Return

Article ID:   W17279
File Created: 2014:07:18:09:51:40
Last Updated: 2014:07:18:09:51:40