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$}", "");
正确输出: