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?
Daniel Baldoni
/* -----------------------------------------------------------------------
* formatting.c
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.10 2000/06/09 01:11:08 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.11 2000/06/09 03:18:34 momjian Exp $
*
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
get_th(char *num, int type)
{
int len = strlen(num),
- last;
+ last, seclast;
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')
+ /*
+ * 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)