Le 09/07/2019 à 20:28, Chet Ramey écrivait :
On 7/9/19 11:26 AM, lea.g...@noiraude.net wrote:Bash Version: 5.0 Patch Level: 3 Release Status: release Description: When formatting floating point numbers in Bash's built-in printf with %s, the argument format depends on the LC_NUMERIC environment variable.As POSIX requires: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_04 The `decimal_point' member of the LC_NUMERIC category defines the radix character in floating point numbers, for both input and output.
This depends on the behavior of strtold/strtod. POSIX requires strtod to honor the radix character as defined in LC_NUMERIC. Since LC_NUMERIC determines the radix character for input and output, it looks like `bc' is not POSIX conformant.
So many different behaviors of the printf '%f' $floatnum is a minefield. $ locale -ck decimal_point LC_NUMERIC decimal_point=","GNU coreutils 8.30 printf input POSIX/C's LC_NUMERIC format, but output locale setting's LC_NUMERIC format
$env printf --version printf (GNU coreutils) 8.30 $ env printf '%f\n' 0.5 0,500000 $ env printf '%f\n' 0,5 printf: «0,5» : valeur non complètement convertie 0,000000Whereas Bash printf both input and output to locale setting's LC_NUMERIC format.
Given bc is a language and thus has to stick to a constant representation of floating-point numbers, it has good reasons to use a decimal point rather than varying floating point numbers format with locale settings.
It appears more logical that printf that does formatting, outputs accordingly to the locale settings while handling its parameters with the POSIX or C locale decimal_point as does the GNU coreutils printf.
It also greatly ease integration.I won't argument anymore on the merits of either behavior, although it would be helpful and probably save Bash scripts writers some troubles, if the specifics of %f with Bash's built-in printf %f format were documented.
I also note that while you says the Bash's built-in printf %f honour LC_NUMERIC decimal_point="," locale for input and output.
I note that Bash's built-in printf %f or %d does not honour LC_NUMERIC thousands_sep=" " when dealing with integers.
$ printf '%f\n' '1 000 000' bash: printf: 1 000 000: nombre non valable 1,000000 locale -ck thousands_sep LC_NUMERIC thousands_sep=" " $ printf '%d\n' '1 000 000' bash: printf: 1 000 000: nombre non valable 1 -- Léa Gris
signature.asc
Description: OpenPGP digital signature