# 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.

``` REM Hexadecimal padded with zeros
DEFFNh0(A%,N%)=RIGHT\$("0000000"+STR\$~A%,N%)
:
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%)
:
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%)
:
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%)
:
`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`.