Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.
; 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