guile-user
[Top][All Lists]
Advanced

[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’.




reply via email to

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