|
|
|
| 12 February 2002 | Flip_Numsep() |
| Author | W.M. Hinsch (New Mexico Mark) |
| Action | Add or remove number separators (i.e. commas for U.S.) in a number. |
| Syntax | Flip_Numsep (String) |
| Parameters | |
| Remarks | This is one of a series of functions that detects what format a string/number is supplied in and inverts that format. Hence the "flip" name. The number separator is obtained from the international section of the registry. |
| Returns | A string. |
| Dependencies | Flip_Currency() will be used if numbers with a currency symbol are supplied to Flip_Numsep(). |
| Examples |
$str = "1,234,567.89" ?
FOR $i = 12 TO 1 STEP -1
$s = SubStr($str,$i)
"Flip_NumSep(" + Chr(34) + $s + Chr(34) + ") = " + Chr(34) + Flip_NumSep($s) + Chr(34) ?
NEXT
$str = "1234567.890" ?
FOR $i = 0 TO 11
$s = SubStr($str,1,Len($str) - $i)
"Flip_NumSep(" + Chr(34) + $s + Chr(34) + ") = " + Chr(34) + Flip_NumSep($s) + Chr(34) ?
NEXT
; Console Output (Example)
;Flip_NumSep("9") = "9"
;Flip_NumSep("89") = "89"
;Flip_NumSep(".89") = ".89"
;Flip_NumSep("7.89") = "7.89"
;Flip_NumSep("67.89") = "67.89"
;Flip_NumSep("567.89") = "567.89"
;Flip_NumSep(",567.89") = "567.89"
;Flip_NumSep("4,567.89") = "4567.89"
;Flip_NumSep("34,567.89") = "34567.89"
;Flip_NumSep("234,567.89") = "234567.89"
;Flip_NumSep(",234,567.89") = "234567.89"
;Flip_NumSep("1,234,567.89") = "1234567.89"
;Flip_NumSep("1234567.890") = "1,234,567.890"
;Flip_NumSep("1234567.89") = "1,234,567.89"
;Flip_NumSep("1234567.8") = "1,234,567.8"
;Flip_NumSep("1234567.") = "1,234,567."
;Flip_NumSep("1234567") = "1,234,567"
;Flip_NumSep("123456") = "123,456"
;Flip_NumSep("12345") = "12,345"
;Flip_NumSep("1234") = "1,234"
;Flip_NumSep("123") = "123"
;Flip_NumSep("12") = "12"
;Flip_NumSep("1") = "1"
;Flip_NumSep("") = ""
|
| Source |
FUNCTION Flip_Numsep ($svar)
; This function takes an expression that evaluates to a string or that can be
; directly converted to a string. It adds (or removes if present) the system
; number separator from every third place in the string and returns the
; modified string. It can handle strings with a system decimal character in
; them (i.e. "1234.56" will return "1,234.56")
; Conditional dependencies are: UDF_Flip_Currency
;
IF VarType($svar) < 2 OR VarType($svar) > 8
RETURN
ENDIF
DIM $cdec, $csep, $ccur, $ibeg, $iend, $svar, $ilen, $i, $j
DIM $chr, $sreg, $bcur, $bdec
$bcur=0 $bdec=0 $ibeg=Len($svar) $iend=1
$svar = "" + $svar
$ilen = Len($svar)
$sreg = 'HKCU\Control Panel\International'
$csep = ReadValue($sreg,'sThousand')
$cdec = ReadValue($sreg,'sDecimal')
$ccur = ReadValue($sreg,'sCurrency')
; Remove a currency symbol, if it exists. This is a conditional dependency on Flip_Currency()
IF InStr($svar,$ccur)
$svar = flip_currency($svar)
$bcur = 1
ENDIF
; If a decimal character is present, start to the left of it
IF InStr($svar,$cdec)
$ibeg = InStr($svar,$cdec) - 1
$bdec = 1
ELSE
$ibeg = Len($svar)
ENDIF
IF InStr($svar,$csep) > 0 ; Separator(s) present - remove all
FOR $i = 1 TO $ilen
$chr = Substr($svar,$i,1)
IF ($chr <> $csep)
$flip_numsep = $flip_numsep + $chr
ENDIF
NEXT
ELSE
; Separator not present, add
; Counter $j is needed because $i might not start at 1
$j = 1
FOR $i = $ibeg TO $iend STEP -1
$flip_numsep = "" + Substr($svar,$i,1) + $flip_numsep
IF $j - (($j / 3) * 3) = 0 AND $i <> $iend
$flip_numsep = "" + $csep + $flip_numsep
ENDIF
$j = $j + 1
NEXT
; If decimal present, re-add and parse remainder
IF $bdec
FOR $i = $ibeg + 1 TO Len($svar)
$flip_numsep = "" + $flip_numsep +
Substr($svar,$i,1)
NEXT
ENDIF
ENDIF
; Restore separation characters if stripped earlier
IF $bcur
$flip_numsep=flip_cur($flip_numsep)
ENDIF
ENDFUNCTION ; - Flip_Numsep -
|
|
|
|