带有零填充数字的意外算术结果
Unexpected arithmetic result with zero padded numbers
我的脚本有问题,我正在读取一个文件,每行都有表示数量的数据。所述字段的长度始终为 12,并且始终为整数。假设我有 25,000 笔,数据将如下所示 000000025000
.
显然,我必须获得这些行的总数,但零前缀会扰乱计算。如果我将上述数字添加到这样的零值:
echo $(( 0 + 000000025000 ))
我得到的不是 25000
,而是 10752
。我正在考虑遍历 000000025000
,当我最终得到一个非零值时,我将从该索引开始对该数字进行子字符串化。不过,我希望一定有更优雅的解决方案。
数字 000000025000
是以 0
开头的八进制数。
如果您使用 bash 作为您的 shell,您可以使用前缀 10#
将基数强制为十进制:
echo $(( 10#000000025000 ))
来自 bash 手册页:
Constants with a leading 0 are interpreted as octal numbers. A leading 0x or 0X denotes hexadecimal. Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.
使用 Perl
$ echo "000000025000" | perl -ne ' { printf("%d\n",scalar($_)) } '
25000
我的脚本有问题,我正在读取一个文件,每行都有表示数量的数据。所述字段的长度始终为 12,并且始终为整数。假设我有 25,000 笔,数据将如下所示 000000025000
.
显然,我必须获得这些行的总数,但零前缀会扰乱计算。如果我将上述数字添加到这样的零值:
echo $(( 0 + 000000025000 ))
我得到的不是 25000
,而是 10752
。我正在考虑遍历 000000025000
,当我最终得到一个非零值时,我将从该索引开始对该数字进行子字符串化。不过,我希望一定有更优雅的解决方案。
数字 000000025000
是以 0
开头的八进制数。
如果您使用 bash 作为您的 shell,您可以使用前缀 10#
将基数强制为十进制:
echo $(( 10#000000025000 ))
来自 bash 手册页:
Constants with a leading 0 are interpreted as octal numbers. A leading 0x or 0X denotes hexadecimal. Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.
使用 Perl
$ echo "000000025000" | perl -ne ' { printf("%d\n",scalar($_)) } '
25000