はじめに
先行ゼロのためにこんなコードを書いてしまったのでフォーマットについて調べようと思いました。
if n < 10 {
println!("00{}", n);
} else if n < 100 {
println!("0{}", n);
} else {
println!("{}", n);
}
公式ドキュメントの一部を日本語にした感じです。
フォーマット文字列の形式
基本
変数をそのまま出力する場合は{}と記述します。
let x = 5;
println!("x = {}", x); // x = 5
{}と出力したい場合は、{{}}と記述します。
println!("{{}}"); // {}
出力する変数にはstd::fmt::Displayトレイトを実装している必要があります。
// `std::vec::Vec<{integer}>` doesn't implement `std::fmt::Display`
println!("{}", vec![0, 1, 2]);
その場合でもstd::fmt::Debugトレイトを実装していれば、{:?}と記述することでデバッグ用の形式で出力できます。{:#?}と記述すると、改行されて見やすくなります。
println!("{:?}", vec![0, 1, 2]); // [0, 1, 2]
println!("{:#?}", vec![0, 1, 2]);
/*
[
0,
1,
2,
]
*/
右揃え、左揃え、中央揃え
{:(埋める文字)(方向)(文字数)}の形式で指定します。
- 埋める文字:文字数で足りない部分を埋める文字です。デフォルトはスペースです。
- 方向:以下の形式で指定します。
-
>: 右揃え -
^: 中央揃え -
<: 左揃え
-
println!("{:<5}", "x"); // x
println!("{:^5}", "x"); // x
println!("{:>5}", "x"); // x
符号を表示する
+をつけると、正の値の時にも符号が出力されます。0のときには+になるようです。
println!("{:+}", 5); // +5
println!("{:+}", 0); // +0
println!("{:+}", -0); // +0
println!("{:+}", -5); // -5
ゼロ埋め
{:0(文字数)}とすることで、指定した文字数になるように0で埋めることができます。
println!("{:03}", 1); // 001
println!("{:03}", -1); // -01
println!("{:03}", 1000); // 1000
2進、8進、16進、指数表記で出力する
bとつけることで2進数表記になります。前述の符号付けやゼロ埋めと併用できます。
println!("{:04b}", 7); // 0111
println!("{:+b}", 7); // +111
oで8進、xで16進、eで指数表記になります。それぞれ対応するトレイトを実装している必要があります。
自作の構造体を表示させる
#[derive(Debug)]と記述することで、構造体にDebugトレイトを実装できるので、{:?}でデバッグ用の出力ができます。std::fmt::Displayトレイトを実装することで、独自の形式で出力することができます。
use std::fmt;
# [derive(Debug)]
struct MyBool {
value: bool
}
impl fmt::Display for MyBool {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", if self.value { "Yes" } else { "No" })
}
}
fn main() {
let my_bool = MyBool {
value: true
};
println!("{:?}", my_bool);
println!("{}", my_bool);
}
おわりに
もう冒頭のようなコードは書かなくて良くなりました。