[Raku] 如何將數字換底

作者:   發佈於:   #rakulang

Raku 的數值在轉為字串時,普通都是以十進位來表示。若要將十進位數字轉成其他進位數字,要用的是 base 函式。base 的處理對象是數值 (IntRat 型別),傳回一個字串 (Str 型別)。

將底為 $a 的數字字串 $s 的底換為 $b 的通用算式是:

$t = $s.parse-base($a).base($b);

... 其中 $s$t 皆為 Str 型別的字串。

$a$b 的範圍為 2..32。

以下以幾項特例來說明。

數值轉十六進位: .base(16)

若要將 Int 型別的整數 $n 轉為 16 進位:

my Int $n = 42;
my Str $s = $n.base(16);

say $s;
#=> 2A

若要將 Rat 型別的有理數 $n 轉為 16 進位:

my Rat $n = 42.42;
my Str $s = $n.base(16);

say $s;
#=> 2A.6B851F

數值轉二進位: .base(2)

若要將 Int 型別的整數 $n 轉為二進位:

my Int $n = 42;
my Str $s = $n.base(2);

say $s;
#=> 101010

若要將 Rat 型別的有理數 $n 轉為二進位:

my Rat $n = 42.42;
my Str $s = $n.base(2);

say $s;
#=> 101010.011011

數值轉八進位: .base(8)

若要將 Int 型別的整數 $n 轉為八進位:

my Int $n = 42;
my Str $s = $n.base(8);

say $s;
#=> 52

若要將 Rat 型別的有理數 $n 轉為八進位:

my Rat $n = 42.42;
my Str $s = $n.base(8);

say $s;
#=> 52.327024

數值轉三十二進位: .base(32)

三十二進位是 base 能處理的最高進位。

若要將 Int 型別的整數 $n 轉為三十二進位:

my Int $n = 42;
my Str $s = $n.base(32);

say $s;
#=> 1A

若要將 Rat 型別的有理數 $n 轉為三十二進位:

my Rat $n = 42.42;
my Str $s = $n.base(32);

say $s;
#=> 1A.DE2HTE

十六進位轉十進位: .parse-base(16).base(10)

若要將十六進位數字串轉為十進位數字字串,首先可用 .parse-base(16) 進行解析,再以 .base(10) 進行換底。

my Str $s = "42b";
my Str $t = $s.parse-base(16).base(10);

say $t;
#=> 1067

十六進位轉八進位: .parse-base(16).base(8)

若要將十六進位數字串轉為八進位數字字串,首先可用 .parse-base(16) 進行解析,再以 .base(8) 進行換底。

my Str $s = "42b";
my Str $t = $s.parse-base(16).base(8);

say $t;
#=> 2053

十六進位轉二進位: .parse-base(16).base(2)

若要將十六進位數字串轉為二進位數字字串,首先可用 .parse-base(16) 進行解析,再以 .base(2) 進行換底。

my Str $s = "42b";
my Str $t = $s.parse-base(16).base(2);

say $t;
#=> 10000101011