はじめに
先行ゼロのためにこんなコードを書いてしまったのでフォーマットについて調べようと思いました。
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);
}
おわりに
もう冒頭のようなコードは書かなくて良くなりました。