From 5f128d5fe8705dddcb45081b79e0d642c9683b50 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 24 Nov 2007 15:28:02 +0000 Subject: [PATCH] Make the MONEY data type have a thousands separator != decimal symbol, if the locale has the thousands separator as "". This now matches the to_char and psql numericlocale behavior. (Previously this data type was basically useless for such setups.) --- src/backend/utils/adt/cash.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c index ab68486c66..a7c6225f8a 100644 --- a/src/backend/utils/adt/cash.c +++ b/src/backend/utils/adt/cash.c @@ -13,7 +13,7 @@ * this version handles 64 bit numbers and so can hold values up to * $92,233,720,368,547,758.07. * - * $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.75 2007/11/23 19:54:39 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.76 2007/11/24 15:28:02 momjian Exp $ */ #include "postgres.h" @@ -148,7 +148,11 @@ cash_in(PG_FUNCTION_ARGS) fpoint = 2; /* best guess in this case, I think */ dsymbol = ((*lconvert->mon_decimal_point != '\0') ? *lconvert->mon_decimal_point : '.'); - ssymbol = ((*lconvert->mon_thousands_sep != '\0') ? *lconvert->mon_thousands_sep : ','); + if (*lconvert->mon_thousands_sep != '\0') + ssymbol = *lconvert->mon_thousands_sep; + else + /* ssymbol should not equal dsymbol */ + ssymbol = (dsymbol != ',') ? ',' : '.'; csymbol = ((*lconvert->currency_symbol != '\0') ? lconvert->currency_symbol : "$"); psymbol = ((*lconvert->positive_sign != '\0') ? *lconvert->positive_sign : '+'); nsymbol = ((*lconvert->negative_sign != '\0') ? lconvert->negative_sign : "-"); @@ -293,20 +297,20 @@ cash_out(PG_FUNCTION_ARGS) if (mon_group <= 0 || mon_group > 6) mon_group = 3; - ssymbol = ((*lconvert->mon_thousands_sep != '\0') ? *lconvert->mon_thousands_sep : ','); convention = lconvert->n_sign_posn; dsymbol = ((*lconvert->mon_decimal_point != '\0') ? *lconvert->mon_decimal_point : '.'); + if (*lconvert->mon_thousands_sep != '\0') + ssymbol = *lconvert->mon_thousands_sep; + else + /* ssymbol should not equal dsymbol */ + ssymbol = (dsymbol != ',') ? ',' : '.'; csymbol = ((*lconvert->currency_symbol != '\0') ? lconvert->currency_symbol : "$"); nsymbol = ((*lconvert->negative_sign != '\0') ? lconvert->negative_sign : "-"); point_pos = LAST_DIGIT - points; - /* allow more than three decimal points and separate them */ - if (ssymbol) - { - point_pos -= (points - 1) / mon_group; - ssymbol_position = point_pos % (mon_group + 1); - } + point_pos -= (points - 1) / mon_group; + ssymbol_position = point_pos % (mon_group + 1); /* we work with positive amounts and add the minus sign at the end */ if (value < 0) @@ -333,7 +337,8 @@ cash_out(PG_FUNCTION_ARGS) strncpy((buf + count - strlen(csymbol) + 1), csymbol, strlen(csymbol)); count -= strlen(csymbol) - 1; - if (buf[LAST_DIGIT] == ',') + /* XXX What does this do? It seems to duplicate the last character. */ + if (buf[LAST_DIGIT] == ssymbol) buf[LAST_DIGIT] = buf[LAST_PAREN]; /* see if we need to signify negative amount */