guile-user
[Top][All Lists]
Advanced

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

Fwd: Formatted output with locale


From: Vladimir Zhbanov
Subject: Fwd: Formatted output with locale
Date: Mon, 14 Nov 2016 09:06:08 +0300

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

---------- Forwarded message ----------
From: Vladimir Zhbanov <address@hidden>
Date: Mon, 14 Nov 2016 09:03:19 +0300
Subject: Re: Formatted output with locale
To: address@hidden

Hi Martin,

On 11/13/16, address@hidden <address@hidden> 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

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