Non-decimal radices/Convert: Difference between revisions

Content added Content deleted
(Improved and updated both D entries)
Line 339: Line 339:


=={{header|D}}==
=={{header|D}}==
===Using Standard Functions===
D standard library string module included functions to convert number to string at a radix.
<lang d>module std.string;
<lang d>import std.stdio, std.conv, std.string;
char[] toString(long value, uint radix);
char[] toString(ulong value, uint radix);</lang>
Implementation.
<lang d>module radixstring ;
import std.stdio ;
import std.ctype ;


void main() {
const string Digits = "0123456789abcdefghijklmnopqrstuvwxyz" ;
"1abcd".to!int(16).writeln();


toLower(60_272_032_366.to!string(36) ~ " " ~
int dtoi(char dc, int radix) {
591_458.to!string(36)).writeln();
static int[char] digit ;
}</lang>
char d = tolower(dc) ;
{{out}}
if (digit.length == 0) // not init yet
<pre>109517
foreach(i,c ; Digits)
rosetta code</pre>
digit[c] = i ;
===One Implementation===
if (radix > 1 & radix <= digit.length)
<lang d>import std.stdio, std.array, std.ascii;
if (d in digit)
if (digit[d] < radix)
return digit[d] ;
return int.min ; // a negative for error ;
}


enum string mDigits = "0123456789abcdefghijklmnopqrstuvwxyz";
ulong AtoI(string str, int radix = 10, int* consumed = null) {

ulong result = 0;
ulong atoiRadix(in string str, in int radix=10, int* consumed=null) {
int sp = 0 ;
static int dtoi(in char dc, in int radix) {
for(; sp < str.length ; sp++) {
int d = dtoi(str[sp], radix) ;
static int[immutable char] digit;
if (d >= 0) // valid digit char
immutable char d = cast(char)toLower(dc);
result = radix*result + d ;
if (digit.length == 0) // not init yet
foreach (i, c; mDigits)
else
break ;
digit[c] = i;
if (radix > 1 && radix <= digit.length &&
}
if(sp != str.length) // some char in str not converted
d in digit && digit[d] < radix)
sp = -sp ;
return digit[d];
return int.min; // a negative for error.
if (!(consumed is null)) // signal error if not positive ;
}
*consumed = sp ;

return result ;
ulong result;
int sp;
for (; sp < str.length; sp++) {
immutable int d = dtoi(str[sp], radix);
if (d >= 0) // valid digit char
result = radix * result + d;
else
break;
}
if (sp != str.length) // some char in str not converted.
sp = -sp;
if (consumed !is null) // signal error if not positive.
*consumed = sp;
return result;
}
}


string ItoA(ulong num, int radix = 10) {
string itoaRadix(ulong num, in int radix=10) pure nothrow
in {
string result = null ;
// if (radix < 2 || radix > Digits.length) throw Error
assert(radix > 1 && radix <= mDigits.length);
} body {
while (num > 0) {
string result;
int d = num % radix ;
result = Digits[d]~ result ;
while (num > 0) {
num = (num - d) / radix ;
//immutable int d = num % radix;
immutable int d = cast(int)(num % radix);
}
return result == null ? "0" : result ;
result = mDigits[d] ~ result;
num = (num - d) / radix;
}
return result.empty ? "0" : result;
}
}


void main(string[] args) {
void main() {
string numstr = "1ABcdxyz???" ;
immutable string numStr = "1ABcdxyz???";

int ate ;
int ate;
writef("%s (%d) = %d",numstr, 16, AtoI(numstr, 16, &ate)) ;
writef("'%s' (base %d) = %d", numStr, 16,
if(ate <= 0) writefln("\tcheck: %s<%s>",numstr[0..-ate], numstr[-ate..$]) ;
atoiRadix(numStr, 16, &ate));
else writefln() ;

writefln(ItoA(60272032366,36)," ",ItoA(591458,36)) ;
if (ate <= 0)
writefln("\tConverted only: '%s'", numStr[0 .. -ate]);
else
writeln();

writeln(itoaRadix(60_272_032_366, 36), " ",
itoaRadix(591_458, 36));
}</lang>
}</lang>
{{out}}
<pre>'1ABcdxyz???' (base 16) = 109517 Converted only: '1ABcd'
rosetta code<pre>

=={{header|E}}==
=={{header|E}}==
<lang e>def stringToInteger := __makeInt
<lang e>def stringToInteger := __makeInt