Thread: Ordinal suffix behaviour

Ordinal suffix behaviour

From
Daniel Baldoni
Date:
G'day folks,

The enclosed patch changes the behaviour of the "ordinal" ('TH') format for
to_char.  I don't know about the rest of the world, but the "standard" in
Australia is the following:

    1st, 2nd, 3rd, 4th - 9th
    10th - 19th
    21st, 22nd, 23rd, 24th - 29th (similarly for 30s - 90s)
    110th - 119th (and for all "teens")
    121st, 122nd, 123rd, 124th - 129th

I think you see the trend.  The current code works fine except that it
produces:

    111st, 112nd, 113rd, 114th - 119th
    211st, 212nd, 213rd, 214th - 219th ... and so on.

Without knowing anything about what's supported (and what isn't) in the usual
I18N libraries, should this type of behaviour be defined within the locales?

*** src/backend/utils/adt/formatting.c.orig    Fri Jun  9 04:33:30 2000
--- src/backend/utils/adt/formatting.c    Fri Jun  9 04:35:48 2000
***************
*** 1258,1271 ****
  get_th(char *num, int type)
  {
      int            len = strlen(num),
!                 last;

      last = *(num + (len - 1));
      if (!isdigit((unsigned char) last))
          elog(ERROR, "get_th: '%s' is not number.", num);

!     /* 11 || 12 */
!     if (len == 2 && (last == '1' || last == '2') && *num == '1')
          last = 0;

      switch (last)
--- 1258,1274 ----
  get_th(char *num, int type)
  {
      int            len = strlen(num),
!                 last, seclast;

      last = *(num + (len - 1));
      if (!isdigit((unsigned char) last))
          elog(ERROR, "get_th: '%s' is not number.", num);

!     /*
!      * All "teens" (<x>1[0-9]) get 'TH/th',
!      * while <x>[02-9][123] still get 'ST/st', 'ND/nd', 'RD/rd', respectively
!      */
!     if ((len > 1) && ((seclast = num[len-2]) == '1'))
          last = 0;

      switch (last)



-------------------------------------------------------+---------------------
Daniel Baldoni BAppSc, PGradDipCompSci                 |  Technical Director
require 'std/disclaimer.pl'                            |  LcdS Pty. Ltd.
-------------------------------------------------------+  856B Canning Hwy
Phone/FAX:  +61-8-9364-8171                            |  Applecross
Mobile:     041-888-9794                               |  WA 6153
URL:        http://www.lcds.com.au/                    |  Australia
-------------------------------------------------------+---------------------
"Any time there's something so ridiculous that no rational systems programmer
 would even consider trying it, they send for me."; paraphrased from "King Of
 The Murgos" by David Eddings.  (I'm not good, just crazy)

Re: Ordinal suffix behaviour

From
Giles Lean
Date:
On 08 Jun 2000 21:01:37 GMT  Daniel Baldoni wrote:

> Without knowing anything about what's supported (and what isn't) in the usual
> I18N libraries, should this type of behaviour be defined within the
> locales?

It's not defined in POSIX or the "Single Unix Specification, version
2".  Or at least if it is defined, I can neither see it nor remember
it. ;-)

Regards,

Giles




Re: Ordinal suffix behaviour

From
Bruce Momjian
Date:
Applied.  Thanks.


> G'day folks,
>
> The enclosed patch changes the behaviour of the "ordinal" ('TH') format for
> to_char.  I don't know about the rest of the world, but the "standard" in
> Australia is the following:
>
>     1st, 2nd, 3rd, 4th - 9th
>     10th - 19th
>     21st, 22nd, 23rd, 24th - 29th (similarly for 30s - 90s)
>     110th - 119th (and for all "teens")
>     121st, 122nd, 123rd, 124th - 129th
>
> I think you see the trend.  The current code works fine except that it
> produces:
>
>     111st, 112nd, 113rd, 114th - 119th
>     211st, 212nd, 213rd, 214th - 219th ... and so on.
>
> Without knowing anything about what's supported (and what isn't) in the usual
> I18N libraries, should this type of behaviour be defined within the locales?
>
> *** src/backend/utils/adt/formatting.c.orig    Fri Jun  9 04:33:30 2000
> --- src/backend/utils/adt/formatting.c    Fri Jun  9 04:35:48 2000
> ***************
> *** 1258,1271 ****
>   get_th(char *num, int type)
>   {
>       int            len = strlen(num),
> !                 last;
>
>       last = *(num + (len - 1));
>       if (!isdigit((unsigned char) last))
>           elog(ERROR, "get_th: '%s' is not number.", num);
>
> !     /* 11 || 12 */
> !     if (len == 2 && (last == '1' || last == '2') && *num == '1')
>           last = 0;
>
>       switch (last)
> --- 1258,1274 ----
>   get_th(char *num, int type)
>   {
>       int            len = strlen(num),
> !                 last, seclast;
>
>       last = *(num + (len - 1));
>       if (!isdigit((unsigned char) last))
>           elog(ERROR, "get_th: '%s' is not number.", num);
>
> !     /*
> !      * All "teens" (<x>1[0-9]) get 'TH/th',
> !      * while <x>[02-9][123] still get 'ST/st', 'ND/nd', 'RD/rd', respectively
> !      */
> !     if ((len > 1) && ((seclast = num[len-2]) == '1'))
>           last = 0;
>
>       switch (last)
>
>
>
> -------------------------------------------------------+---------------------
> Daniel Baldoni BAppSc, PGradDipCompSci                 |  Technical Director
> require 'std/disclaimer.pl'                            |  LcdS Pty. Ltd.
> -------------------------------------------------------+  856B Canning Hwy
> Phone/FAX:  +61-8-9364-8171                            |  Applecross
> Mobile:     041-888-9794                               |  WA 6153
> URL:        http://www.lcds.com.au/                    |  Australia
> -------------------------------------------------------+---------------------
> "Any time there's something so ridiculous that no rational systems programmer
>  would even consider trying it, they send for me."; paraphrased from "King Of
>  The Murgos" by David Eddings.  (I'm not good, just crazy)
>


--
  Bruce Momjian                        |  http://www.op.net/~candle
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026