Martin,
I'm sorry for the private reply, my fault :-(
Forward to the list.

---------- Forwarded message ----------
From: Vladimir Zhbanov <[email protected]>
Date: Mon, 14 Nov 2016 09:03:19 +0300
Subject: Re: Formatted output with locale
To: [email protected]

Hi Martin,

On 11/13/16, [email protected] <[email protected]> wrote:
> Hi there,
> I have problems to get a proper formatting using the (ice-9 format)
> module. In my code, I need to deal with monetary figures, but I fail
> to get the correct format for my German locale.
> Let's say I have one hundred thousand Euros. The correct format to output
> this in de_DE.utf-8 would be
> 100.000,00 EUR
> (with 2 decimals)
>
> Now I tried:
> (setlocale LC_ALL "de_DE.UTF-8")
> (use-modules (ice-9 format))
> (define a 100000.00)
> (format #t "~12,2h EUR~%" a)
> (format #t "~,,12$ EUR~%" a)
> (format #t "~12,2f EUR~%" a)
>
> But this is what Guile gives to me:
>    100.000,0 EUR
>    100000.00 EUR
>    100000.00 EUR
>
> None is correct. What did I miss?
> -Martin

Looking at the `format' code for option `h' I see the procedure
`number->locale-string' is used.

OK, let's do some experiments:

scheme@(guile-user)> (setlocale LC_ALL)
$2 = "ru_RU.UTF-8"
scheme@(guile-user)> ,use (ice-9 i18n)
scheme@(guile-user)> (number->locale-string 10.0 5)
$3 = "10,0"
scheme@(guile-user)> (number->locale-string .00003 2)
$4 = "3,0e"
scheme@(guile-user)> (number->locale-string .00003 1)
$5 = "3,0"
scheme@(guile-user)> (number->locale-string .00003 3)
$6 = "3,0e-"
scheme@(guile-user)> (number->locale-string .0 3)
$7 = "-0,0"
scheme@(guile-user)> (number->locale-string .0 10)
$8 = "-0,0"
scheme@(guile-user)> (number->locale-string .0 1)
$9 = "-0,0"

Now for the procedure monetary-amount->locale-string:

scheme@(guile-user)> (monetary-amount->locale-string .0 #t)
$10 = "-0.0 RUB "
scheme@(guile-user)> (monetary-amount->locale-string 100000.0 #t)
$11 = "100\xa0000.0 RUB "
scheme@(guile-user)> (monetary-amount->locale-string .00003 #t)
$12 = "3.0e RUB "

And my guile version:

scheme@(guile-user)> (version)
$13 = "2.0.11"


It seems `number->locale-string' is broken. If I do, e.g.
  (number->locale-string .00003 10)
it yields
  "3,0e-5"

If the last arg decreases, it just trims the number of
characters after comma, which is wrong in this case.

Output for zero is funny, too.

Regards,
  Vladimir

Reply via email to