Non-decimal radices/Convert: Difference between revisions

Content added Content deleted
(→‎{{header|AutoHotkey}}: alternate implementation)
Line 681: Line 681:


=={{header|Perl}}==
=={{header|Perl}}==
To parse from a base:
Perl has some built-in capabilites for various conversions between decimal, hexadecimal, octal, and binary, but not other bases.
<lang perl>use POSIX;

my ($num, $n_unparsed) = POSIX::strtol('1a', 16);
$n_unparsed == 0 or die "invalid characters found";
print "$num\n"; # prints "26"</lang>

To format into a base:
<lang perl>sub digitize
<lang perl>sub digitize
# Converts an integer to a single digit.
# Converts an integer to a single digit.
{my $i = shift;
{my $i = shift;
return $i < 10
$i < 10
? $i
? $i
: ('a' .. 'z')[$i - 10];}
: ('a' .. 'z')[$i - 10];}

sub undigitize
# Converts a digit to an integer.
{my $i = shift;
return $i =~ /\d/
? $i
: 10 + ord($i) - ord('a');}


sub to_base
sub to_base
{my ($int, $radix) = @_;
{my ($int, $radix) = @_;
my $numeral = digitize($int % $radix);
my $numeral = '';
do {
$numeral .= digitize($int % $radix)
while $int = int($int / $radix);
$numeral .= digitize($int % $radix);
} while $int = int($int / $radix);
return scalar reverse $numeral;}
scalar reverse $numeral;}</lang>

sub from_base
{my ($numeral, $radix) = @_;
$numeral = reverse $numeral;
my $int = 0;
for (my $n = 0 ; $numeral ; ++$n)
{$int += $radix**$n * undigitize substr($numeral, 0, 1, '');}
return $int;}</lang>


=={{header|PHP}}==
=={{header|PHP}}==