[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Formatted output with locale
From: |
Ludovic Courtès |
Subject: |
Re: Formatted output with locale |
Date: |
Mon, 21 Nov 2016 10:31:09 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) |
Vladimir Zhbanov <address@hidden> skribis:
> On Thu, Nov 17, 2016 at 12:02:06PM +0100, Ludovic Courtès wrote:
>> Hi!
>>
>> address@hidden skribis:
>>
>> > 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
>>
>> It seems to work as advertised for me:
>>
>> --8<---------------cut here---------------start------------->8---
>> scheme@(guile-user)> ,use(ice-9 i18n)
>> scheme@(guile-user)> (number->locale-string 10000.01 2 (make-locale LC_ALL
>> "fr_FR.utf8"))
>> $13 = "10 000,01"
>> scheme@(guile-user)> (number->locale-string 10000.01 2 (make-locale LC_ALL
>> "de_DE.utf8"))
>> $14 = "10.000,01"
>> scheme@(guile-user)> ,use(ice-9 format)
>> scheme@(guile-user)> (setlocale LC_ALL "de_DE.utf8")
>> $15 = "de_DE.utf8"
>> scheme@(guile-user)> (format #f "~12,2h" 10000.01)
>> $16 = " 10.000,01"
>> --8<---------------cut here---------------end--------------->8---
>
> What does it output if you type
> (number->locale-string 10000.00 2 (make-locale LC_ALL "fr_FR.utf8"))
>
> that is with two zeros after the point?
I get this:
--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> (number->locale-string 10000.00 2 (make-locale LC_ALL
"fr_FR.utf8"))
$1 = "10 000,0"
scheme@(guile-user)> (number->locale-string 10000.00 4 (make-locale LC_ALL
"fr_FR.utf8"))
$2 = "10 000,0"
--8<---------------cut here---------------end--------------->8---
… and that’s definitely a bug.
Could you send it to address@hidden so we keep track of it?
>> That’s on GNU/Linux (glibc 2.24).
>>
>> Note that number formatting data comes from the C library. What C
>> library do you use?
>
> My glibc version is 2.19.
It might be responsible for the incorrect thousand and fraction
separators you observe in the de_DE output. To dig further, you can
check the low-level info provided by ‘nl_langinfo’:
--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> ,use(ice-9 i18n)
scheme@(guile-user)> (define l (make-locale LC_ALL "de_DE.utf8"))
scheme@(guile-user)> (locale-digit-grouping l)
$2 = (3 3 . #-1#)
scheme@(guile-user)> (locale-decimal-point l)
$3 = ","
scheme@(guile-user)> (locale-thousands-separator l)
$4 = "."
--8<---------------cut here---------------end--------------->8---
Thanks,
Ludo’.