Steve Hicks (N5AC)
11-10-2006, 10:35 AM
I really like numbers.spin.· It is a real work of art!· I have been using it to display numbers, but I'm having trouble getting rid of the leading space for positive numbers.· Upon investigation, it appears that there is a mandatory sign character on the front of a string created with ToStr -- if the number is positive and no display of a sign is selected in the config, it·places a space on the front of the string instead.· I prefer, however,·to not have anything on the front of the number if it is positive and I've not selected a sign.· I made a slight modification to the internal routine, BCXToText as shown below that accomplishes this.· Just in case someone else has the same desire...· Just replace this one routine in your numbers.spin file·or you can use·the attached modified numbers.spin file.
PRI BCXToText(IChar, Grouping, ShowPlus, SPad, Field, Digits): Size | Idx, GCnt, SChar, GChar, X
'Convert BCX Buffer contents to z-string at StrBuf.
'IChar..Field each correspond to elements of Format. See "FORMAT SYNTAX" for more information.
'If Field = 0, Digits+1+Grouping is the effective field (always limited to max of 49).
'Digits : Number of significant digits (not counting zero-left-padding).
'RETURNS: Actual Size (length) of output string, not including null terminator.
SChar := "+" + 2*(BCX3 >> 28) + 11*(not (ShowPlus | (BCX3 >> 28)) or ((Digits == 1) and (BCX0 == 0))) 'Determine sign character ('+', ' ' or '-')
X := -(SChar <> " ")-(IChar > 0) 'Xtra char count (0, 1 or 2, for sign and optional base indicator)
IChar := Symbols[--IChar] 'Get base indicator character
GChar := Symbols[Grouping & 7 - 1 #> 0] 'Get group character
if Field > 0 and SPad^1 and Digits < 32 'Need to add extra zero-padding?
BCX3 &= $0FFFFFFF ' then clear negative flag and set to 32 digits
Digits := 32
Grouping := -((Grouping >>= 3) - (Grouping > 0))*(Grouping+1 < Digits) 'Get group size (0 if not enough Digits)
Size := (Field - (Field==0)*(Digits+X+((Digits-1)/Grouping))) <# 49 'Field = 0? Set Size to Digits+X+Grouping (max 49).
if Grouping 'Insert group chars
bytefill(@StrBuf+(Size-Digits-(Digits-1)/Grouping #> 2), GChar, Digits+(Digits-1)/Grouping <# Size-4)
Idx~~ 'Insert digits
repeat while (++Idx < Digits) and (Idx + (GCnt := Idx/Grouping) < Size-X)
byte[@StrBuf][Size-Idx-1-GCnt] := lookupz(byte[@BCX0][Idx>>1] >> (4 * Idx&1) // 16: "0".."9","A".."F")
bytefill(@StrBuf, " ", Size-Idx-(Idx-1)/Grouping #> 0) 'Left pad with spaces, if necessary
IF SChar <> " "
byte[@StrBuf][Size-X-Idx-(Idx-1)/Grouping #> 0] := SChar 'Insert sign
if X == 2
byte[@StrBuf][Size-1-Idx-(Idx-1)/Grouping #> 1] := IChar 'Insert base indicator, if necessary
byte[@StrBuf][Size] := 0 'Zero-terminate string
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Steve, N5AC
Post Edited (Steve Hicks (N5AC)) : 11/10/2006 3:57:18 AM GMT
PRI BCXToText(IChar, Grouping, ShowPlus, SPad, Field, Digits): Size | Idx, GCnt, SChar, GChar, X
'Convert BCX Buffer contents to z-string at StrBuf.
'IChar..Field each correspond to elements of Format. See "FORMAT SYNTAX" for more information.
'If Field = 0, Digits+1+Grouping is the effective field (always limited to max of 49).
'Digits : Number of significant digits (not counting zero-left-padding).
'RETURNS: Actual Size (length) of output string, not including null terminator.
SChar := "+" + 2*(BCX3 >> 28) + 11*(not (ShowPlus | (BCX3 >> 28)) or ((Digits == 1) and (BCX0 == 0))) 'Determine sign character ('+', ' ' or '-')
X := -(SChar <> " ")-(IChar > 0) 'Xtra char count (0, 1 or 2, for sign and optional base indicator)
IChar := Symbols[--IChar] 'Get base indicator character
GChar := Symbols[Grouping & 7 - 1 #> 0] 'Get group character
if Field > 0 and SPad^1 and Digits < 32 'Need to add extra zero-padding?
BCX3 &= $0FFFFFFF ' then clear negative flag and set to 32 digits
Digits := 32
Grouping := -((Grouping >>= 3) - (Grouping > 0))*(Grouping+1 < Digits) 'Get group size (0 if not enough Digits)
Size := (Field - (Field==0)*(Digits+X+((Digits-1)/Grouping))) <# 49 'Field = 0? Set Size to Digits+X+Grouping (max 49).
if Grouping 'Insert group chars
bytefill(@StrBuf+(Size-Digits-(Digits-1)/Grouping #> 2), GChar, Digits+(Digits-1)/Grouping <# Size-4)
Idx~~ 'Insert digits
repeat while (++Idx < Digits) and (Idx + (GCnt := Idx/Grouping) < Size-X)
byte[@StrBuf][Size-Idx-1-GCnt] := lookupz(byte[@BCX0][Idx>>1] >> (4 * Idx&1) // 16: "0".."9","A".."F")
bytefill(@StrBuf, " ", Size-Idx-(Idx-1)/Grouping #> 0) 'Left pad with spaces, if necessary
IF SChar <> " "
byte[@StrBuf][Size-X-Idx-(Idx-1)/Grouping #> 0] := SChar 'Insert sign
if X == 2
byte[@StrBuf][Size-1-Idx-(Idx-1)/Grouping #> 1] := IChar 'Insert base indicator, if necessary
byte[@StrBuf][Size] := 0 'Zero-terminate string
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Steve, N5AC
Post Edited (Steve Hicks (N5AC)) : 11/10/2006 3:57:18 AM GMT