zsh 中 printf 的千位分隔符

zsh 中 printf 的千位分隔符

我已经尝试定义千位分隔符有printf一段时间了,我发现 zsh 有一些问题。

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

$ printf "%'d\n" 1234567890
1,234,567,890

但在 zsh 中它不起作用:

$ printf "%'d\n" 1234567890
printf: %': invalid directive

我刚刚发现 coreutilsprintf可以很好地做到这一点:

$/usr/bin/printf "%'d\n" 1234567890
1,234,567,890

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

$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu) 

答案1

更新:截至zsh v. 5.1,内置支持通过像/那样printf对数千个进行分组(另请参阅讨论'bashcoreutils printf这里)。


千位分隔符是zsh 不支持的 GNU 扩展,并且它有自己的printf内置函数,您最终会使用它。正如链接文章中提到的,您可以通过以下方式获取与区域设置相关的千位分隔符:

zmodload zsh/langinfo
echo $langinfo[THOUSEP]

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

使用非内置的可能会更容易printf来自 GNU coreutils相反,如果您的系统允许使用千位分隔符选项:

$ command printf "%'d\n" 1234567890
1,234,567,890

command printf告诉外壳不是使用内置命令或别名,但要在$PATH.

答案2

来补充迈克尔的回答,您可以使用运算符手动执行千位格式化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}

相关内容