11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ユニークビジョン株式会社Advent Calendar 2021

Day 15

Rustで使いそうな出力フォーマットをまとめてみました

Last updated at Posted at 2021-12-14

はじめに

先行ゼロのためにこんなコードを書いてしまったのでフォーマットについて調べようと思いました。

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);
}

おわりに

もう冒頭のようなコードは書かなくて良くなりました。

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?