Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > gnu.bash.bug > #14305

Re: Number with sign is read as octal despite a leading 10#

From Ilkka Virta <itvirta@iki.fi>
Newsgroups gnu.bash.bug
Subject Re: Number with sign is read as octal despite a leading 10#
Date 2018-07-10 13:44 +0300
Message-ID <mailman.3361.1531219465.1292.bug-bash@gnu.org> (permalink)
References <CA+n9pTy7vSPUA0j-bDF9_eWF0XysePRDAFckgvvHX8haSWv7KQ@mail.gmail.com> <c8ae5df2-b6b3-438f-bd99-4618f6b2d3c0@Spark>

Show all headers | View raw


I think the problematic case here is when the number comes as input from 
some program, which might or might not print a leading sign or leading 
zeroes, but when we know that the number is, in any case, decimal.

E.g. 'date' prints leading zeroes, which is easy enough to handle:

hour=$(date +%H)

hour=${hour#0}         # remove one leading zero, or
hour="10#$hour"        # make it base-10

The latter works even with more than one leading zero, but neither works 
with a sign. So, handling numbers like '-00159' gets a bit annoying:

$ num='-00159'
$ num="${num:0:1}10#${num:1}"; echo $(( num + 1 ))
-158

And that's without checking that the sign was there in the first place.


Something like that will probably not be too common, but an easier way 
to force any number to be interpreted in base-10 (regardless of leading 
zeroes) could be useful. If there is a way, I'd be happy to hear.


On 10.7. 04:37, Clint Hepner wrote:
> The + is a unary operator, not part of the literal. Write $((+10#0034)) instead.
> 
> --
> Clint
> On Jul 9, 2018, 9:24 PM -0400, Isaac Marcos <isaacmarcos100010@gmail.com>, wrote:
>> Configuration Information [Automatically generated, do not change]:
>> Machine: x86_64
>> OS: linux-gnu
>> Compiler: gcc
>> Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64'
>> -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu'
>> -DCONF_VENDOR
>> uname output: Linux IO 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1
>> (2018-05-07) x86_64 GNU/Linux
>> Machine Type: x86_64-pc-linux-gnu
>>
>> Bash Version: 4.4
>> Patch Level: 12
>> Release Status: release
>>
>> Description:
>> A value inside an arithmetic expansion is processed as octal despite using
>> a 10# preffix.
>>
>> Repeat-By:
>> $ echo $((10#+0034))
>> 28
>>
>> Fix:
>> Extract optional sign before parsing the number, re-attach after.
>>
>> --
>> Cases are always threesome:
>> Best case, Worst case, and Just in case


-- 
Ilkka Virta / itvirta@iki.fi

Back to gnu.bash.bug | Previous | Next | Find similar | Unroll thread


Thread

Re: Number with sign is read as octal despite a leading 10# Ilkka Virta <itvirta@iki.fi> - 2018-07-10 13:44 +0300

csiph-web