Re: [DOCS] Failing example for to_number()

Поиск
Список
Период
Сортировка
От Erwin Brandstetter
Тема Re: [DOCS] Failing example for to_number()
Дата
Msg-id CAGHENJ45Lt40ab8rjLo-OjxuXoLZduJTaBi5iPk-z259nkFsRQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [DOCS] Failing example for to_number()  ("David G. Johnston" <david.g.johnston@gmail.com>)
Ответы Re: [DOCS] Failing example for to_number()  ("David G. Johnston" <david.g.johnston@gmail.com>)
Re: [DOCS] Failing example for to_number()  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-docs

On 21 August 2017 at 16:30, David G. Johnston <david.g.johnston@gmail.com> wrote:
On Mon, Aug 21, 2017 at 5:36 AM, Erwin Brandstetter <brsaweda@gmail.com> wrote:
The manual suggests here:

https://www.postgresql.org/docs/current/static/functions-formatting.html#FUNCTIONS-FORMATTING-TABLE

> to_number(text, text) |  numeric convert string to numeric | to_number ('12,454.8-', '99G999D9S')

The example fails for locales where the comma (',') does not happen to be the group separator and the dot ('.') is not the decimal point.

The example is incorrectly assuming en_US locale. It must instead work locale-agnostic. Replace:

to_number ('12,454.8-', '99G999D9S')

with:

to_number ('12,454.8-', '99,999.9S')


​I can see the appeal of demonstrating the locale-dependent G and D symbols so that a user becoming familiar with the feature knows that they have options other than just writing out the comma and period literally.  If one wants to try the example in a language other than in which the example was written they should modify it so that the literal number being parsed in written in conformance to the locale definition for the language you are using.

David J.

 
Well, there is still 'S' in the pattern to pointing to non-literal pattern symbols (without making the example fail). I see your point, though.

On top of this (separate issue?) ',' and '.' are ***not*** interpreted according to the current LC_NUMERIC setting. I.e.: even with (example) Austrian locale, ',' still is interpreted as group separator and '.' still is the decimal point. 
It seems those just follow standard meaning without locale (C locale) - while 'D' and 'G' pattern symbols enforce locale specific format. It took me a while to untangle this and I suspect many people will fail to understand it.

I guess there should be some more explanation.

I stumbled across this while working on this answer on dba.stackexchange.com:

Regards
Erwin

В списке pgsql-docs по дате отправления:

Предыдущее
От: "David G. Johnston"
Дата:
Сообщение: Re: [DOCS] Failing example for to_number()
Следующее
От: "David G. Johnston"
Дата:
Сообщение: Re: [DOCS] Failing example for to_number()