[Raku] 如何將數字換底
作者:gugod 發佈於: #rakulangRaku 的數值在轉為字串時,普通都是以十進位來表示。若要將十進位數字轉成其他進位數字,要用的是 base
函式。base
的處理對象是數值 (Int
或 Rat
型別),傳回一個字串 (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