用零填充数字

use*_*067 10 printf typeset

我正在尝试将零填充到一个数字

a=010
printf "%04d" $a
0008
Run Code Online (Sandbox Code Playgroud)

我需要“输出”为“0010”,它正在转换值。

甚至尝试排版

a=010
typeset -RZ2 a
echo $a
Run Code Online (Sandbox Code Playgroud)

当我在脚本中使用它时,出现以下错误:

Invalid -R option
Run Code Online (Sandbox Code Playgroud)

Bar*_*run 15

不要在数字的开头放一个“0”——它以八进制为基数处理数字。只需分配十进制数。

a=10    
printf "%04d" $a    
0010    
Run Code Online (Sandbox Code Playgroud)

如果您正在从其他地方读取数字,您可以考虑删除开头的 0,如下所示:

a=0010    
b=$(echo $a | sed 's/^0*//')    
printf "%04d" $a    
0008
printf "%04d" $b    
0010    
Run Code Online (Sandbox Code Playgroud)


F. *_*uri 12

新答案使用 %08.0f

由于%f用于打印十进制浮点数,参数必须为十进制。

所以没有看到参数被解释为八进制的风险:

简单地做:

a=0010

a=`printf %08.0f $a` 
Run Code Online (Sandbox Code Playgroud)

或者

a=$(printf %08.0f $a)
Run Code Online (Sandbox Code Playgroud)

然后

echo $a
00000010
Run Code Online (Sandbox Code Playgroud)

这项工作可以在任何POSIX 下找到

使用,您可以通过使用以下-v选项来避免分叉printf

a=0010
printf -v a %08.0f $a
echo $a
00000010
Run Code Online (Sandbox Code Playgroud)

旧答案(使用%d

在 POSIX

您可以0使用以下命令删除左侧字符:

a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010
Run Code Online (Sandbox Code Playgroud)

由于这不会分叉新的命令会话,因此这可能比使用sed.

您可以使用以下语法强制十进制解释:

a=000010
printf "%08d" $((10#$a))
00000010
Run Code Online (Sandbox Code Playgroud)

这可能对转换有用:

a="0a"
printf "%04d" $((16#$a))
0010

a="00001010"
printf "%04d" $((2#$a))
0010

a="00012"
printf "%04d" $((8#$a))
0010

a="0020"
printf "%04d" $((5#$a))
0010

a="0013"
printf "%04d" $((7#$a))
0010
Run Code Online (Sandbox Code Playgroud)

等等...

a="zz"
printf "%04d" $((36#$a))
1295
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以通过使用不同的转换说明符来实现这一点,例如“f”说明符。从printf 手册

f, f

double 参数被四舍五入并转换为 [-]ddd.ddd 样式中的十进制表示法,其中小数点字符后的位数等于精度规范。如果精度缺失,则取6;如果精度明确为零,则不会出现小数点字符。如果出现小数点,则在其前面至少出现一位。

但是我们真的不想要您的数字的浮点表示,因此我们必须指定精度为零。这应该这样做:

a=010
printf "%04.0f" $a
Run Code Online (Sandbox Code Playgroud)

我假设您使用的是 Linux,但这也应该适用于其他类型的 Unix。