[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: built-in printf %f parameter format depend on LC_NUMERIC

From: Dennis Clarke
Subject: Re: built-in printf %f parameter format depend on LC_NUMERIC
Date: Fri, 12 Jul 2019 15:46:56 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.0

On 7/12/19 3:25 PM, Chet Ramey wrote:
On 7/12/19 3:22 PM, Eli Schwartz wrote:
On 7/12/19 3:16 PM, Chet Ramey wrote:
On 7/12/19 12:46 PM, Léa Gris wrote:
Le 09/07/2019 à 22:02, Chet Ramey écrivait :

These are up to the system's strtol/strtod. I don't know of too many
strtol implementations that use the thousands separator and numeric

Chet and you other Bash maintainers or contributors dudes:

I can foresee the implications and blockages even lightly considering the
possibility to align the Bash's built-in printf behavior with the %f
argument with the sibling GNU Coreutils printf implementation.

I don't think I explained this very well. For input, the printf builtin
relies on strtod(3) to parse the string into a floating point number. For
output, it relies on printf(3) to display a floating point number as a
string. I'm not really interested in re-implementing either one if the
system libc provides one that's perfectly acceptable. On POSIX-conformant
systems, those library functions generally honor the locale's decimal_point
character as the radix character.

The `bc' you're using isn't POSIX conformant.


"The bc utility always uses the <period> ( '.' ) character to represent
a radix point, regardless of any decimal-point character specified as
part of the current locale.

Good catch. I went by the bc man page that Dennis Williamson posted.

Well the man page for XPG6 bc in Solaris 10 claims :

     See environ(5) for descriptions of the following environment
     variables  that  affect  the  execution of bc: LANG, LC_ALL,


Looking through "Standards, Environments, and Macros" environ(5) seems
to be bluntly saying :

         Most commands will invoke setlocale(LC_ALL, "") prior to
         any other processing. This allows the command to be used
         with  different  national  conventions  by  setting  the
         appropriate environment variables.

uh huh ...


             This category specifies the  decimal  and  thousands
             delimiters.  The  information  corresponding to this
             category is stored in a  database   created  by  the
             localedef()    command.   The   default   C   locale
             corresponds to "." as the decimal delimiter  and  no
             thousands  delimiter.  This  environment variable is
             used by localeconv(3C), printf(3C), and strtod(3C).


corv $
corv $ LC_ALL=fr_FR.UTF-8 LC_NUMERIC=fr_FR.UTF-8 /usr/xpg6/bin/bc -l
a = 0,1
syntax error on line 1, teletype
a = 0.1
b = 0.11
c = a + b


corv $

baloney.   :-)

I am going to look at the sources for bc just for the fun of it.

Dennis Clarke
UNIX and Linux spoken
GreyBeard and suspenders optional

reply via email to

[Prev in Thread] Current Thread [Next in Thread]