zsh中printf中的千位分隔符

Pat*_*ryk 4 zsh numeric-data printf

printf一段时间以来,我一直在尝试定义千位分隔符,但我发现 zsh 存在一些问题。

在 bash 中,我可以使用类似的东西:

$ printf "%'d\n" 1234567890
1,234,567,890
Run Code Online (Sandbox Code Playgroud)

但在 zsh 中它不起作用:

$ printf "%'d\n" 1234567890
printf: %': invalid directive
Run Code Online (Sandbox Code Playgroud)

我刚刚发现 coreutilsprintf会做得很好:

$/usr/bin/printf "%'d\n" 1234567890
1,234,567,890
Run Code Online (Sandbox Code Playgroud)

如何在 zsh 中使用千位分隔符?

$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu) 
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 10

更新:从 开始zsh v. 5.1printf内置程序支持通过'bash/那样对数千人进行分组coreutils printf(另请参阅此处的讨论)。


千位分隔符是zsh 不支持GNU 扩展,它有自己的printf内置函数,您最终会使用它。如链接帖子中所述,您可以通过以下方式获取依赖于语言环境的千位分隔符:

zmodload zsh/langinfo
echo $langinfo[THOUSEP]
Run Code Online (Sandbox Code Playgroud)

如果您需要专门且专门地使用 zsh,则可以将其与 sed 一起使用。

使用printf来自 GNU coreutils的非内置函数可能更容易,如果您的系统这样做,它将允许千位分隔符选项:

$ command printf "%'d\n" 1234567890
1,234,567,890
Run Code Online (Sandbox Code Playgroud)

command printf告诉 shell不要使用内置函数或别名,而是在$PATH.

  • 我建议使用 `command printf` 而不是 `/bin/printf`,后者不可移植。 (3认同)

Sté*_*las 5

为了补充迈克尔的答案,您可以使用以下运算符手动执行千位格式化zsh

var=1234567

zmodload zsh/langinfo
setopt extendedglob
echo $var[1,(l=-($#var-1)/3*3)-1]${var[l,l?-1:l]//(#m)???/$langinfo[THOUSEP]$MATCH}
Run Code Online (Sandbox Code Playgroud)