是否可以在Rust中打印一个用千位分隔符格式化的数字?
例如
println!("{}", 10_000_000);
结果是
10000000
而我想将其格式化为类似
10,000,000
我浏览了fmt
模块文档,但没有任何内容能够涵盖这种特殊情况。 我认为这样的事情会起作用
println!("{:,i}", 10_000_000);
但它会引发错误
invalid format string: expected `}`, found `,`
没有,并且可能不会有。
根据您的位置,千位分隔符可能也会像1,00,00,000
,或1.000.000,000
或其他一些变体一样工作。
本地化不是stdlib的工作,加上format!
主要是在编译时处理的(尽管公平地说,它可以很容易地放置在它的运行时部分),并且你不想在程序中强制使用区域设置。
另一个解决方法是使用在float,integer和size类型上实现.separated_string()
方法的saparator
crate。 这里是一个例子:
extern crate separator;
use separator::Separatable;
fn main() {
let x1: u16 = 12345;
let x2: u64 = 4242424242;
let x3: u64 = 232323232323;
println!("Unsigned ints:n{:>20}n{:>20}n{:>20}n", x1.separated_string(), x2.separated_string(), x3.separated_string());
let x1: i16 = -12345;
let x2: i64 = -4242424242;
let x3: i64 = -232323232323;
println!("Signed ints:n{:>20}n{:>20}n{:>20}n", x1.separated_string(), x2.separated_string(), x3.separated_string());
let x1: f32 = -424242.4242;
let x2: f64 = 23232323.2323;
println!("Floats:n{:>20}n{:>20}n", x1.separated_string(), x2.separated_string());
let x1: usize = 424242;
// let x2: isize = -2323232323; // Even though the docs say so, the traits seem not to be implemented for isize
println!("Size types:n{:>20}n", x1.separated_string());
}
它给你以下输出:
Unsigned ints:
12,345
4,242,424,242
232,323,232,323
Signed ints:
-12,345
-4,242,424,242
-232,323,232,323
Floats:
-424,242.44
23,232,323.2323
Size types:
424,242
请注意,像这样对齐浮动并不容易,因为separated_string()
返回一个字符串。 但是,这是分离数字的一种相对快速的方法。
关于自定义功能,我玩过这个,这里有一些想法:
use std::str;
fn main() {
let i = 10_000_000i;
println!("{}", decimal_mark1(i.to_string()));
println!("{}", decimal_mark2(i.to_string()));
println!("{}", decimal_mark3(i.to_string()));
}
fn decimal_mark1(s: String) -> String {
let bytes: Vec<_> = s.bytes().rev().collect();
let chunks: Vec<_> = bytes.chunks(3).map(|chunk| str::from_utf8(chunk).unwrap()).collect();
let result: Vec<_> = chunks.connect(" ").bytes().rev().collect();
String::from_utf8(result).unwrap()
}
fn decimal_mark2(s: String) -> String {
let mut result = String::with_capacity(s.len() + ((s.len() - 1) / 3));
let mut i = s.len();
for c in s.chars() {
result.push(c);
i -= 1;
if i > 0 && i % 3 == 0 {
result.push(' ');
}
}
result
}
fn decimal_mark3(s: String) -> String {
let mut result = String::with_capacity(s.len() + ((s.len() - 1) / 3));
let first = s.len() % 3;
result.push_str(s.slice_to(first));
for chunk in s.slice_from(first).as_bytes().chunks(3) {
if !result.is_empty() {
result.push(' ');
}
result.push_str(str::from_utf8(chunk).unwrap());
}
result
}
幼儿园:http://is.gd/UigzCf
评论欢迎,他们都没有感觉真的很好。
链接地址: http://www.djcxy.com/p/82645.html上一篇: Is it possible to print a number formatted with thousand separator in Rust?