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.1
,printf
内置程序支持通过'
像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
.
为了补充迈克尔的答案,您可以使用以下运算符手动执行千位格式化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)