如何在控制台上打印格式良好的表格?

31

我有一个程序,打印出应该以表格形式呈现的数据。但是当数字超过2位数时,表格就会出现问题。我知道在std::fmt中有一个叫做width的参数,但我无法理解它。

当前输出:

---------------------------------------
| total | blanks: | comments: | code: |
---------------------------------------
|  0   |    0    |    0     |    0  |
|  77   |    0    |    3     |    74  |
|  112   |    0    |    6     |    106  |
|  178   |    0    |    6     |    172  |
|  218   |    0    |    7     |    211  |
|  289   |    0    |    8     |    281  |
|  380   |    0    |    9     |    371  |
|  460   |    0    |    10     |    450  |
|  535   |    0    |    11     |    524  |
|  611   |    0    |    12     |    599  |
|  692   |    0    |    14     |    678  |
|  772   |    0    |    17     |    755  |
|  873   |    0    |    18     |    855  |
|  963   |    0    |    19     |    944  |
|  1390   |    0    |    19     |    1371  |
|  1808   |    0    |    19     |    1789  |
|  2011   |    0    |    19     |    1992  |
|  2259   |    0    |    19     |    2240  |
|  2294   |    0    |    19     |    2275  |
|  2349   |    0    |    19     |    2330  |
|  2376   |    0    |    19     |    2357  |
|  2430   |    0    |    19     |    2411  |
|  2451   |    0    |    19     |    2432  |
|  2515   |    13    |    19     |    2483  |
|  2559   |    13    |    19     |    2527  |

尝试使用TAB而不是空格。对于少于8个字符的数字或字符串应该可以正常工作。 - Stephan
3
如果您使用制表符,我编写了一个crate来实现弹性制表位,它将根据列的长度对齐列:https://github.com/BurntSushi/tabwriter - BurntSushi5
2个回答

47

语法类似于Python中的str.format语法。这个:

fn main() {
    println!(
        "{0: <10} | {1: <10} | {2: <10} | {3: <10}",
        "total", "blanks", "comments", "code"
    );
    println!("{0: <10} | {1: <10} | {2: <10} | {3: <10}", 0, 0, 0, 0);
    println!("{0: <10} | {1: <10} | {2: <10} | {3: <10}", 77, 0, 3, 74);
    println!("{0: <10} | {1: <10} | {2: <10} | {3: <10}", 112, 0, 6, 106);
    println!(
        "{0: <10} | {1: <10} | {2: <10} | {3: <10}",
        460, 0, 10, 1371
    );
}

(playground)

的输出如下:

total      | blanks     | comments   | code      
0          | 0          | 0          | 0         
77         | 0          | 3          | 74        
112        | 0          | 6          | 106       
460        | 0          | 10         | 1371  

4
为什么不用{: <10} | {: <10} ...代替{0: <10} | {1: <10} ...?我刚测试了前者,似乎可以达到相同的效果。 - joe

9

或者你可以使用一个专门格式化表格的箱子,例如prettytable-rs


7
如果有人现在看到这条评论,请注意,prettytable似乎不再维护,但是有一个名为tabled的替代品。 - Stef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接