Code: Select all
Procedure.s x_strex(var.l,format.s) ; convert int to string using a format field, format characters space and -+#.#
Protected s.s, fl.l, sl.l, *f.BYTE, *s.BYTE, p.l, sb.l
;
; *** format integer to string
;
; in: var.l - int varar
; f.s - format
; out: .s - string
;
; convarert int varar to string using a pattern
;
; pattern elements:
;
; '#' - number or leading zero
; ' ' - space, number or (when there's no '+' or '-' used in the format) sign
; '+' - positivare or negative indicator
; '.' - decimal sign
;
; examples:
;
; x_strex( 1234, "###") = "***"
; x_strex( 1234, "##.##") = "12.34"
; x_strex(-1234, "##.##") = "*****"
; x_strex( 1, ".#####") = ".00001"
; x_strex( -1, "+ .##") = "- .01"
;
fl = Len(format)
s = Str(var)
sl = Len(s)
;
*f.BYTE = @format+fl ; using two pointers and two counters
*s.BYTE = @s+sl
;
If PeekB(@format) = '+' ; remember is there is a sign in a fixed place
p = 2
ElseIf PeekB(@format) = '-'
p = 1
EndIf
;
While fl > 0
*f-1
fl-1
If *f\b = '.' ; skip a dot if we pass one
Else
sl-1
If sl >= 0
*s-1
sb = *s\b ; sb contains the digit, AND is used as a flag
EndIf
Select *f\b
Case '-' ; ah, a sign in a fixed place
If sb = '-'
sb = -1 ; if sb = -1 we'vare managed to store the sign
Else
*f\b = ' '
EndIf
Case '+' ; same thing for the +
If sb = '-'
*f\b = sb
sb = -1
EndIf
Case '#' ; if we havare data that is not a sign we're gonna fill it in
If sb = '-' Or sl < 0
*f\b = '0' ; otherwise it's going to be a zero
Else
*f\b = *s\b
EndIf
Case ' ' ; if there is no fixed spot for a sign we'll store the minus
If sb = '-' ; immediately on the first space we encounter
If p = 0
*f\b = '-'
sb = -1
EndIf
ElseIf sb <> -1 And sl >= 0 ; otherwise we'll just gonna fil it in
*f\b = *s\b
EndIf
EndSelect
EndIf
Wend
;
If sb = '-' Or sl > 0 ; if the sign wasn't stored or there was some data left
format = LSet("",Len(format),"*") ; we'll put in some stars to indicate ovarerflow
EndIf
;
ProcedureReturn format
EndProcedure