Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Various problems with locale--floats interaction



Some info on my configuration (I use Debian):
Package: zsh
Version: 4.0.6-27

Package: zsh-beta
Version: 4.1.0-dev-7+cvs20030217-1


 The first problem.
While trying to understand other things I encountered this:
Amber% export LANG=pl_PL
Amber% zsh              
Amber% echo $[12.12/12] 
1.01
Amber% <Ctrl-D pressed here>
Amber% zsh
Amber% echo $[12.12/12]
1,01

Comma is the locale-correct decimal separator for pl_PL.
ltrace pointed me to the usage of setlocale in zzlex in math.c:
prev_locale argument to
	setlocale(LC_NUMERIC, prev_locale);
gets clobbered (differently each time); man 3 setlocale says:

       A  successful  call to setlocale() returns an opaque string that
       corresponds to the locale set.  This string may be allocated in static storage.

so I think this is probably the problem.


 The second problem.
With LANG=pl_PL
Amber% zsh-beta -f
Amber% echo $[12.12/12]
1,01.
Amber% echo $[12./12]  
1.

So the output contains an unnecessary dot at the end.
NB: I know that the changelog gives a reason for the dot:

        * 16423: Src/params.c: Don't let convfloat output a number
        looking like an integer; append a `.' if necessary.  Otherwise
        the wrong type of arithmetic will be used on numbers stored in
        scalars.

but...


 ...the third (and main) problem.
It will all be wrong anyway with floats-in-scalars in a localized environment.
foo=$((12.12/12)) means foo=1,01 in pl_PL
which means $((foo)) equiv $((1,01)) equiv $((01)) equiv 1

One solution would be locale independent arithmetic expansion,
but then echo $((12.12/12)) would print unlocalized 1.01

Another simple solution is to require typeset -F foo; ((foo=12.12/12))
for repeatable results, and ignore the problem of scalars.

Are there any more complicated but workable solutions?

-- 
Michał Politowski -- mpol@xxxxxxxxxxxxxxxxxxx
Warning: this is a memetically modified message

Attachment: pgpUaUEIJKXO0.pgp
Description: PGP signature



Messages sorted by: Reverse Date, Date, Thread, Author