#フォーマット文字列
RustやPythonでは、フォーマット文字列を使って、複雑なフォーマット指定で整数や浮動小数点数などを表示させることができます。
例えば、フォーマット文字列に {:0>8b}
を使うと「2進数ゼロ詰め8桁」が実現できます。今回は、このフォーマットの 8
の部分を変数に置き換えたい、という話をします。
なお、Pythonの場合は、フォーマット文字列を動的に作ることができるので、このへんの話を覚えるよりも、("{:0>" + str(n) + "b}").format(...)
とした方が楽かもしれません。
けど、一応、静的なフォーマット文字列でもできるということでご紹介します。
とてもつらいことに、RustとPythonで、これを実現するためのフォーマット文字列は異なります
#Rustの場合
fn main() {
let kazu = 15;
let keta = 6;
println!("{:0>haba$b}", kazu, haba = keta);
// または、以下でも可
println!("{:0>1$b}", kazu, keta);
}
:0>
に続けて、パラメータ名を指定し、$
で区切ってから、表示形式を指定します。
そんなのどこに書いてあったのか、という話ですが。ここらへんを頑張って読むと書いてあります。幅だけじゃなく、浮動小数点数の精度も同じく、引数の番号または名前の後に$
を付けるとパラメータを指定したことになる、と分かります。
#Pythonの場合
kazu = 15
keta = 6
"{:0>{haba}b}".format(kazu, haba=keta)
# もしくは
"{0:0>{1}b}".format(kazu, keta)
# これでもよい
"{:0>{}b}".format(kazu, keta)
ドキュメントのBNC記法っぽいものを眺めても、あまりピンとこないのですが、BNC記法じゃないところに「ネストできるよ」と書いてありました。そして例として載ってました。
さらには、こんな闇みたいなこともできます。
# {:>012x}と同じ
"{:{}2{}}".format(10, ">01", "x")
便利ですね♪