Number Conversion in BASIC
BASIC lets you display numbers in decimal or hexadecimal with the
~
prefix and converted to strings with STR$
. These
convert the number to a string consisting of the fewest characters needed.
When outputting fixed-width number strings, the following type of code is often seen:
IF A<16 THEN PRINT "0"; IF A<256 THEN PRINT "0"; IF A<4096 THEN PRINT "0"; PRINT ;~A
or even
IF A<16 THEN PRINT "00";~A ELSE IF A<256 THEN PRINT "0";~A ELSE PRINT ~A
This is very inefficient and messy. The following functions allow conversion to fixed-width strings, and also to octal and binary, which are not supported by BASIC natively.
Hexadecimal Output
REM Hexadecimal padded with zeros DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%) : REM Hexadecimal padded with spaces DEFFNh(A%,N%)=RIGHT$(" "+STR$~A%,N%)
FNh0()
converts the supplied number to a fixed width
hexidecimal string padded with zeros, FNh()
converts the
supplied number to a fixed width hexidecimal string padded with spaces. For
example, FNh0(10,6)
returns 00000A
.
Decimal Output
REM Decimal padded with zeros DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%) : REM Decimal padded with spaces DEFFNd(A%,N%)=RIGHT$(" "+STR$A%,N%)
FNd0()
converts the supplied number to a fixed width decimal
string padded with zeros, FNd()
converts the supplied number to
a fixed width decimal string padded with spaces. For example,
FNd0(10,6)
returns 000010
.
Octal Output
REM Octal padded with zeros DEFFNo0(A%,N%):LOCAL A$,B%,L%:IFA%<0:B%=2:A%=A%AND&7FFFFFFF REPEATA$=STR$(A%AND7)+A$:A%=A%DIV8:L%=L%+3:UNTILL%>27:=RIGHT$(STR$(A%+B%)+A$,N%) : REM Octal padded with spaces DEFFNo(A%,N%):LOCAL A$:IFA%<0:=FNo0(A%,N%) REPEATA$=STR$(A%AND7)+A$:A%=A%DIV8:UNTILA%=0:=RIGHT$(STRING$(N%," ")+A$,N%)
FNo0()
converts the supplied number to a fixed width octal
string padded with zeros, FNo()
converts the supplied number to
a fixed width octal string padded with spaces. For example,
FNo0(10,6)
returns 000012
.
Binary Output
REM Binary padded with zeros DEFFNb0(A%,N%):LOCAL A$,B$,L%:IFA%<0:B$="1":A%=A% AND &7FFFFFFF ELSE B$="0" REPEAT A$=STR$(A%AND1)+A$:A%=A%DIV2:L%=L%+1:UNTILL%>30:=RIGHT$(B$+A$,N%) : REM Binary padded with spaces DEFFNb(A%,N%):LOCAL A$:IFA%<0:=FNb0(A%,N%) REPEAT A$=STR$(A% AND 1)+A$:A%=A%DIV2:UNTIL A%=0:=RIGHT$(STRING$(N%," ")+A$,N%)
FNb0()
converts the supplied number to a fixed width binary
string padded with zeros, FNb()
converts the supplied number to
a fixed width binary string padded with spaces. For example,
FNb0(10,6)
returns 001010
.