Localization trouble
Hi all;
I am trying to find a way to select the number format at runtime for
textual representation of numbers. I am currently running 8.1.4 built
from source on Fedora Linux core 5.
I have been trying to use set lc_numeric = various country codes (for
example es_EC), but I am not able to get the format to change from 1.00
to 1,00.
Any hints as to what I could be doing wrong?
Best Wishes,
Chris Travers
On Jul 5, 2007, at 19:10 , Chris Travers wrote:
I have been trying to use set lc_numeric = various country codes
(for example es_EC), but I am not able to get the format to change
from 1.00 to 1,00.
Any hints as to what I could be doing wrong?
Does this correspond to what you're seeing?
test=# CREATE TABLE lc_examples (a_money money not null, a_numeric
numeric not null);
CREATE TABLE
test=# INSERT INTO lc_examples (a_money, a_numeric) VALUES ('1.32',
-1.32);
INSERT 0 1
test=# CREATE VIEW lc_examples_view AS
SELECT a_money
, a_numeric
, to_char(a_numeric, '999D99S') as a_formatted_numeric
FROM lc_examples;
CREATE VIEW
test=# SELECT * FROM lc_examples_view;
a_money | a_numeric | a_formatted_numeric
---------+-----------+---------------------
$1.32 | -1.32 | 1.32-
(1 row)
test=# SHOW lc_monetary;
lc_monetary
-------------
C
(1 row)
test=# SHOW lc_numeric;
lc_numeric
------------
C
(1 row)
test=# SELECT * FROM lc_examples_view;
a_money | a_numeric | a_formatted_numeric
---------+-----------+---------------------
$1.32 | -1.32 | 1.32-
(1 row)
test=# SET lc_monetary TO 'es_ES';
SET
test=# SET lc_numeric TO 'es_ES';
SET
test=# SELECT * FROM lc_examples_view;
a_money | a_numeric | a_formatted_numeric
---------+-----------+---------------------
Eu1,32 | -1.32 | 1,32-
(1 row)
I don't believe you'll see numbers *as numbers* displayed with the
formatting you desire unless you somehow tell your client (e.g.,
psql) which locale you want to use. I haven't figured out how to do
this yet, though.
Michael Glaesemann
grzm seespotcode net
On Thu, Jul 05, 2007 at 05:10:57PM -0700, Chris Travers wrote:
I am trying to find a way to select the number format at runtime for
textual representation of numbers. I am currently running 8.1.4 built
from source on Fedora Linux core 5.I have been trying to use set lc_numeric = various country codes (for
example es_EC), but I am not able to get the format to change from 1.00
to 1,00.
I think you'll need to use to_char():
test=> set lc_numeric to 'es_ES.UTF-8';
SET
test=> select to_char(1.234, '9D999');
to_char
---------
1,234
(1 row)
The file src/backend/utils/adt/pg_locale.c in the PostgreSQL source
code has comments about how various LC_* settings are used in the
backend.
--
Michael Fuhr
On Jul 5, 2007, at 19:47 , Michael Glaesemann wrote:
I don't believe you'll see numbers *as numbers* displayed with the
formatting you desire unless you somehow tell your client (e.g.,
psql) which locale you want to use. I haven't figured out how to do
this yet, though.
I think display depends on whether or not you configured Postgres
with or without --enable-nls. I never have, so I can't really test
this, but I suspect that display would change with the different lc_*
settings as well. For example, setting lc_messages doesn't do
anything on my machine (built without --enable-nls).
Michael Glaesemann
grzm seespotcode net
Michael Fuhr wrote:
I think you'll need to use to_char():
test=> set lc_numeric to 'es_ES.UTF-8';
SET
test=> select to_char(1.234, '9D999');
to_char
---------
1,234
(1 row)The file src/backend/utils/adt/pg_locale.c in the PostgreSQL source
code has comments about how various LC_* settings are used in the
backend.
Is there a way to accept localized numbers as input?
i.e. '1,39'::numeric?
Michael Glaesemann <grzm@seespotcode.net> writes:
I think display depends on whether or not you configured Postgres
with or without --enable-nls.
No, to_char understands numeric locales regardless of enable-nls.
There is no provision for locale-dependent output from a plain
numeric column; you must use to_char.
regards, tom lane
Chris Travers <chris@travelamericas.com> writes:
Is there a way to accept localized numbers as input?
i.e. '1,39'::numeric?
See to_number().
regards, tom lane
Tom Lane wrote:
Chris Travers <chris@travelamericas.com> writes:
Is there a way to accept localized numbers as input?
i.e. '1,39'::numeric?See to_number().
Thanks! I somehow missed that function in the docs.
Best Wishes,
Chris Travers
On Jul 5, 2007, at 20:59 , Tom Lane wrote:
Michael Glaesemann <grzm@seespotcode.net> writes:
I think display depends on whether or not you configured Postgres
with or without --enable-nls.No, to_char understands numeric locales regardless of enable-nls.
There is no provision for locale-dependent output from a plain
numeric column; you must use to_char.
The to_char results I could see from my tests. I was thinking that
perhaps if NLS was enabled, numeric results in, for example, psql
would be displayed even without using to_char. However, I can't seem
to coax the server to give me results in that way. Perhaps I'm just
doing it wrong.
postgres=# \d lc_examples_view
View "public.lc_examples_view"
Column | Type | Modifiers
-------------------+---------+-----------
a_money | money |
a_numeric | numeric |
a_numeric_as_text | text |
View definition:
SELECT lc_examples.a_money, lc_examples.a_numeric, to_char
(lc_examples.a_numeric, '999D99S'::text) AS a_numeric_as_text
FROM lc_examples;
postgres=# select * from lc_examples_view ;
a_money | a_numeric | a_numeric_as_text
---------+-----------+-------------------
$1.23 | 1.23 | 1.23+
(1 row)
postgres=# set lc_numeric to 'es_ES'; set lc_monetary to 'es_ES';
SET
SET
postgres=# select * from lc_examples_view ;
a_money | a_numeric | a_numeric_as_text
---------+-----------+-------------------
Eu1,23 | 1.23 | 1,23+
(1 row)
Just to clarify, I was thinking that perhaps the a_numeric column
would show a result of 1,23 since lc_numeric was set to es_ES. After
testing with --enable-nls, I see that's not the case.
Michael Glaesemann
grzm seespotcode net