Module
Checkit {
Conv2dec=lambda (n$, frombase=10, dp$=".") -> {
neg=left$(n$,1)="-": if neg then n$=mid$(n$,2)
if instr(n$, dp$)>0 then {
n2$=Piece$(n$,dp$,2)
n$=Piece$(n$, dp$,1)
} else n2$=""
n0=0
l1=len(n$)+1
For i=len(n$) to 1
dig$=Mid$(n$,l1-i,1)
dig=asc(dig$)-48
if dig$>"9" then dig-=7
if dig>=frombase then error "not in base:"+frombase
n0+=dig*frombase^(i-1)
next i
if n2$<>"" then {
For i=1 to len(n2$)
dig$=Mid$(n2$,i,1)
dig=asc(dig$)-48
if dig$>"9" then dig-=7
if dig>=frombase then error "not in base:"+frombase
n0+=dig/frombase^i
Next i
}
if neg then n0-!
=n0
}
Conv2Any$=Lambda$ (dec, tobase=10, dp$=".", prec=16) -> {
a$=""
neg=false
if dec<0 then neg=true
dec=abs(dec)
n2=frac(dec)
if dec=0 then {
a$="0"
} else {
do {
n=dec mod tobase
if n>=10 then n+=7
a$=chr$(n+48)+a$
dec=dec div tobase
} until dec==0
}
if n2<>0 then {
a$+=dp$
prec--
do {
prec--
dec=n2*tobase
n2=frac(dec)
dec-=n2
n2=round(n2)
if dec>=10 then dec+=7
a$+=chr$(dec+48)
} until n2=0 or prec<0
}
if neg then {="-"+a$} else =a$
}
Rem : Locale 1033 ' use . for all print out for decimal point
Print Conv2dec("10111.01011",2); " => ";Conv2Any$(23.34375,2)
Print Conv2Any$(11.90625, 2); " => "; Conv2dec("1011.11101",2)
\\ using , for decimal point
Print Conv2Any$(Conv2dec("1011,11101",2, ","), 10, ",")
Print 12312321.1212
clipboard Conv2Any$(12312321.1212, 2)
\\ using . for 1033 locale
Print Str$(Conv2Dec(Conv2Any$(12312321.1212, 2), 2), 1033)="12312321.1211853"
Print Str$(Conv2Dec(Conv2Any$(12312321.1212, 2,,52), 2), 1033) ="12312321.1212"
}
Checkit
Conv2dec=lambda (n$, frombase=10, dp$=".") -> {
neg=left$(n$,1)="-": if neg then n$=mid$(n$,2)
if instr(n$, dp$)>0 then {
n2$=Piece$(n$,dp$,2)
n$=Piece$(n$, dp$,1)
} else n2$=""
n0=0
l1=len(n$)+1
For i=len(n$) to 1
dig$=Mid$(n$,l1-i,1)
dig=asc(dig$)-48
if dig$>"9" then dig-=7
if dig>=frombase then error "not in base:"+frombase
n0+=dig*frombase^(i-1)
next i
if n2$<>"" then {
For i=1 to len(n2$)
dig$=Mid$(n2$,i,1)
dig=asc(dig$)-48
if dig$>"9" then dig-=7
if dig>=frombase then error "not in base:"+frombase
n0+=dig/frombase^i
Next i
}
if neg then n0-!
=n0
}
Conv2Any$=Lambda$ (dec, tobase=10, dp$=".", prec=16) -> {
a$=""
neg=false
if dec<0 then neg=true
dec=abs(dec)
n2=frac(dec)
if dec=0 then {
a$="0"
} else {
do {
n=dec mod tobase
if n>=10 then n+=7
a$=chr$(n+48)+a$
dec=dec div tobase
} until dec==0
}
if n2<>0 then {
a$+=dp$
prec--
do {
prec--
dec=n2*tobase
n2=frac(dec)
dec-=n2
n2=round(n2)
if dec>=10 then dec+=7
a$+=chr$(dec+48)
} until n2=0 or prec<0
}
if neg then {="-"+a$} else =a$
}
Rem : Locale 1033 ' use . for all print out for decimal point
Print Conv2dec("10111.01011",2); " => ";Conv2Any$(23.34375,2)
Print Conv2Any$(11.90625, 2); " => "; Conv2dec("1011.11101",2)
\\ using , for decimal point
Print Conv2Any$(Conv2dec("1011,11101",2, ","), 10, ",")
Print 12312321.1212
clipboard Conv2Any$(12312321.1212, 2)
\\ using . for 1033 locale
Print Str$(Conv2Dec(Conv2Any$(12312321.1212, 2), 2), 1033)="12312321.1211853"
Print Str$(Conv2Dec(Conv2Any$(12312321.1212, 2,,52), 2), 1033) ="12312321.1212"
}
Checkit
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.