LC_MONETARY formatting

Serge Orlov sombDELETE at pobox.ru
Sat Jan 10 14:12:10 CET 2004


"Colin Fox" <cfox at cfconsulting.ca> wrote in message news:pan.2004.01.10.00.01.07.962349 at cfconsulting.ca...
> On Sat, 10 Jan 2004 00:27:26 +0100, Martin v. Loewis wrote:
>
> > Colin Fox wrote:
> <..>
> >> I would like to be able to print "$12,345.60"
> >>
> >> Is there a format string, or function, or *something* that will take
> >> advantage of the monetary formatting info in the locale object?
> >
> > No.
>
> I can't believe that I'm the first person who ever wanted to print a
> number as a currency value. Why go to the great lengths of what's provided
> in localeconv(), only to leave it up to every single programmer to
> re-implement the solution? What a waste of time and effort!

Compared to the effort of all humanity to move forward the waste
of time and effort is dwarf <wink>

>
> I can't see any reason not to provide a monetary converter within locale,
> particularly when it's obviously got all the info it needs.

It's not as simple as you think. The proper way to do it is to have locale
aware money type.

>
> >
> > IOW, LC_MONETARY is useless for financial applications - if the amount
> > is in ¤, using the locale's currency symbol would be wrong.
>
> That's true whether you use LC_MONETARY or not. Unless you know the units
> your number is in, you can't assign a symbol to it.

That's why LC_MONETARY (strfmon) is broken. Have you read strfmon manual?

> In my case, I have
> numbers that are always in either Canadian or US dollars, so the dollar
> sign is fine, and the thousands-separator value is fine.

You should have money class. It should be a subclass of FixedPoint class.
If you want to deal with Canadian or US dollars only it's as simple as:
class Dollars(FixedPoint):
    def __init__(self,amount):
        super(Dollars,self).__init__(amount)
    def __str__(self):
        if self < 0:
            return locale.format("-$%.2f",-self,True)
        else:
            return locale.format("$%.2f",self,True)


No warranty, of course, that it works and fulfills all your needs.
>>> locale.format("$%.2f",1000000000000,True)
'$1,000,000,000,000.00'

-- Serge.





More information about the Python-list mailing list