首先,我try 了很多libs,但似乎没有一个可以正常工作,我也手动放置了终端宽度,文本都是一样的,它不在终端的中心,有人知道我应该做什么吗?

OPS:我发现,这是因为 colored颜色 的原因,但我怎样才能将其打印在中心并带有 colored颜色 呢?(如果没有 colored颜色 ,它就很好,这就是我发现的)

fn print_centered(content: &str) {
    let term_size = crossterm::terminal::size();
    let term_width = term_size.unwrap_or((80, 24)).0 as usize;

    println!("{: ^term_width$}", content);
}

enter image description here

enter image description here

我用很多 crate 手动try ,但没有像预期的那样正确地将内容集中在中心.

推荐答案

The solution have overall been hinted at in the comments. So this is the culmination of that, along with an actual solution.

正如您已经发现的那样,问题在于标准fill/alignment formatting是基于字符的.而将ANSI colored颜色 代码嵌入字符串中因此算作字符.

这可以使用以下代码观察到:

let width = 25;
let text = "Hello World";
let text2 = format!("\x1b[94m{}\x1b[39m", text);

println!("{:-^width$}", "");
println!("{:-^width$}", text);
println!("{:-^width$}", text2);

println!();
println!("{} characters", text.chars().count());
println!("{} characters", text2.chars().count());

哪些输出:

Using an image, since the output is colored.


一个简单的解决方法是使用console crate,它提供了用于测量文本、填充、截断等的各种实用程序.同时考虑到ASIC代码:

您甚至可以使用100.101来获取终端宽度.

要将包含ASIC代码的字符串置于中心,则需要专门使用pad_str():

use console::{pad_str, Alignment};

let width = 25;
let text = "Hello World";
let text2 = format!("\x1b[94m{}\x1b[39m", text);

let text = pad_str(text, width, Alignment::Center, None);
let text2 = pad_str(&text2, width, Alignment::Center, None);

println!("{:-^width$}", "");
println!("{text}");
println!("{text2}");
println!("{:-^width$}", "");

哪些输出:


同样,pad_str()不会 destruct text,即使它被截断.例如,让我们将width设置为6并使用(省略号)进行截断.

use console::{pad_str, Alignment};

const ELLIPSIS: &str = "\u{2026}";

let width = 6;
let text = "Hello World";
let text2 = format!("\x1b[94m{}\x1b[39m", text);

let text = pad_str(text, width, Alignment::Center, Some(ELLIPSIS));
let text2 = pad_str(&text2, width, Alignment::Center, Some(ELLIPSIS));

println!("{:-^width$}", "");
println!("{text}");
println!("{text2}");
println!("{:-^width$}", "");

正确输出:

Rust相关问答推荐

为什么我的梅森素数代码的指数越大,速度就越快?

关于Rust 中回归的逻辑

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

如何从铁 rust 中呼唤_mm_256_mul_ph?

这种获取-释放关系是如何运作的?

如何正确地将App handler传递给Tauri中的其他模块?

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

如何计算迭代器适配器链中过滤的元素的数量

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

为什么这个变量不需要是可变的?

如果死 struct 实现了/派生了一些特征,为什么Rust会停止检测它们?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

为什么编译器看不到这个 `From` impl?

sha256 摘要仅适用于 &*

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

Rust 中的自动取消引用是如何工作的?

强制特征仅在 Rust 中的给定类型大小上实现

SDL2 没有在终端键上触发?

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

从函数返回 u32 的数组/切片