编程也是很有意思的呢! 2024-04-17 14:25 采纳率: 50%
浏览 10
已结题

关于#rust#的问题:用rust的格式化输出println,指定带中文的字符串的位宽,无效(相关搜索:中英文字符串)

用rust的格式化输出,指定中文字符串的位宽,实际无效,代码如下

println!("{:20}: {:8} kW", "输出功率 P",750);
println!("{:20}: {:8} rpm", "转速 n",750);
println!("{:20}: {}", "hello","测试");
println!("{:20}: {}", "world","测试");
println!("{:20}: {}", "hello,加点中文试试","测试");
println!("{:20}: {}", "hi,少量中文","测试");
println!("{:20}: {}", "hi,中文","测试");

期望的结果是各行的冒号应该上下对齐
实际输出结果如下

img

如图,冒号位置都是乱的,并且和中文字符和中文标点的数量相关。

请问rust怎么做到带中英文的字符串指定位宽,还请大家多多指教,感激不尽!

  • 写回答

5条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    在 Rust 中,fmt::Display 和 fmt::Debug 提供了与格式化字符串有关的功能。但是,Rust 目前不支持直接指定中英文字符串的位宽。这是因为在 Rust 中,默认使用的是 Unicode 字符集,Unicode 字符的宽度不是固定的,而是根据字符的具体属性决定的。

    要解决这个问题,可以考虑使用第三方库 unicode_width,它提供了计算 Unicode 字符串显示宽度的函数。可以使用这个函数计算中英文字符串的宽度,并根据需要进行补齐。

    以下是一个示例代码:

    use unicode_width::UnicodeWidthStr;
    
    fn main() {
        let str1 = "输出功率 P";
        let str2 = "转速 n";
        let str3 = "hello";
        let str4 = "world";
        let str5 = "hello,加点中文试试";
        let str6 = "hi,少量中文";
        let str7 = "hi,中文";
        let width = 20;
    
        println!("{:<width$}: {:8} kW", str1, 750, width = width - UnicodeWidthStr::width(str1));
        println!("{:<width$}: {:8} rpm", str2, 750, width = width - UnicodeWidthStr::width(str2));
        println!("{:<width$}: {}", str3, "测试", width = width - UnicodeWidthStr::width(str3));
        println!("{:<width$}: {}", str4, "测试", width = width - UnicodeWidthStr::width(str4));
        println!("{:<width$}: {}", str5, "测试", width = width - UnicodeWidthStr::width(str5));
        println!("{:<width$}: {}", str6, "测试", width = width - UnicodeWidthStr::width(str6));
        println!("{:<width$}: {}", str7, "测试", width = width - UnicodeWidthStr::width(str7));
    }
    

    你可以尝试在你的项目中添加 unicode_width 依赖,并使用上述代码对中英文字符串进行格式化输出。

    解决方案:

    1. 引入 unicode_width 依赖:在 Cargo.toml 文件中添加 unicode-width = "0.1"
    2. 使用 unicode_width::UnicodeWidthStr 计算中英文字符串的宽度
    3. 在使用 println! 时,使用字符串补齐的方式来对齐输出

    注意事项:这种方法无法像传统的格式化输出控制字符位宽一样精确控制,因为 Unicode 字符的宽度不是固定的,会根据具体字符而变化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见