Rust格式化输出十六进制

先看一个需要实现Hex输出的struct:

struct Color {
    red: u8,
    green: u8,
    blue: u8,
}

再看准备的数据:

for color in [
    Color {red: 128, green: 255, blue: 90},
    Color {red: 0, green: 3, blue: 254},
    Color {red: 0, green: 0, blue: 0},
].iter() {
    println!("{} 0x{:X}", *color, color)
}

在Rust中要为struct实现一个格式化输出,只要实现对应的trait就可以了。在std中fmt::LowerHex和fmt::UpperHex可以用来输出16进制,分别对应的格式化符号是{:x}、{:X}。

顶部引入std::fmt库:

use std::fmt::{self, Formatter, Display, UpperHex};

实现Display和UpperHex特征:

impl Display for Color {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        write!(f, "RGB ({}, {}, {})", self.red, self.green, self.blue)
    }
}

impl UpperHex for Color {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        write!(f, "{:02X}{:02X}{:02X}", self.red, self.green, self.blue)
    }
}

结果:

RGB (128, 255, 90) 0x80FF5A
RGB (0, 3, 254) 0x0003FE
RGB (0, 0, 0) 0x000000

关于Display的实现就不再重复说了,有专门写过关于它的故事《Rust实现fmt::Display和fmt::Debug对struct进行格式化输出》

这里说说UpperHex这个trait(特征)。UpperHex是为了按照大写的格式输出十六进制,用格式化符号{:X}来表示。{:02X}表示输出的长度为2,如果不足两位,则补0。

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:Rust格式化输出十六进制

本文地址:https://jizhong.plus/post/2017/12/rust-format-hex.html