Non-decimal radices/Convert: Difference between revisions
Content added Content deleted
(+ third D entry) |
|||
Line 600: | Line 600: | ||
<pre>'1ABcdxyz???' (base 16) = 109517 Converted only: '1ABcd' |
<pre>'1ABcdxyz???' (base 16) = 109517 Converted only: '1ABcd' |
||
rosetta code</pre> |
rosetta code</pre> |
||
===Alternative Implementation=== |
|||
{{trans|Haskell}} |
|||
<lang d>import std.stdio, std.conv, std.algorithm, std.exception, std.ascii, |
|||
std.array; |
|||
alias Digits = ubyte[]; |
|||
Digits toBase(ulong number, in ubyte base) pure nothrow { |
|||
Digits result; |
|||
while (number) { |
|||
result = number % base ~ result; |
|||
number /= base; |
|||
} |
|||
return result; |
|||
} |
|||
ulong fromBase(in Digits digits, in ubyte base) pure nothrow { |
|||
return reduce!((n, k) => n * base + k)(0, digits); |
|||
} |
|||
string fromDigits(in Digits digits) pure nothrow { |
|||
return digits |
|||
.map!(d => cast(char)(d < 10 ? d + '0' : d + 'a' - 10)) |
|||
.array; |
|||
} |
|||
Digits toDigits(in string number) pure /*nothrow*/ { |
|||
static ubyte convert(in dchar d) pure nothrow { |
|||
if (d.isDigit) return cast(typeof(return))(d - '0'); |
|||
if (d.isUpper) return cast(typeof(return))(d - 'A' + 10); |
|||
else return cast(typeof(return))(d - 'a' + 10); |
|||
} |
|||
return number.map!convert.array; |
|||
} |
|||
void main() { |
|||
"1ABcd".toDigits.fromBase(16).writeln; |
|||
}</lang> |
|||
{{out}} |
|||
109517 |
|||
=={{header|E}}== |
=={{header|E}}== |