提交 469a4875 编写于 作者: T Tom Lane

Fix cash_in() to behave properly in locales where frac_digits is zero,

eg Japan.  Report and fix by Itagaki Takahiro.  Also fix CASHDEBUG printout
format for branches with 64-bit money type, and some minor comment cleanup.

Back-patch to 7.4, because it's broken all the way back.
上级 96c6b333
......@@ -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.77.2.1 2008/06/09 19:58:46 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/adt/cash.c,v 1.77.2.2 2009/06/10 16:31:38 tgl Exp $
*/
#include "postgres.h"
......@@ -207,23 +207,21 @@ cash_in(PG_FUNCTION_ARGS)
for (;; s++)
{
/* we look for digits as int8 as we have less */
/* we look for digits as long as we have found less */
/* than the required number of decimal places */
if (isdigit((unsigned char) *s) && dec < fpoint)
if (isdigit((unsigned char) *s) && (!seen_dot || dec < fpoint))
{
value = (value * 10) + *s - '0';
value = (value * 10) + (*s - '0');
if (seen_dot)
dec++;
}
/* decimal point? then start counting fractions... */
else if (*s == dsymbol && !seen_dot)
{
seen_dot = 1;
}
/* not "thousands" separator? */
/* ignore if "thousands" separator, else we're done */
else if (*s != ssymbol)
{
/* round off */
......@@ -252,7 +250,7 @@ cash_in(PG_FUNCTION_ARGS)
result = value * sgn;
#ifdef CASHDEBUG
printf("cashin- result is %d\n", result);
printf("cashin- result is " INT64_FORMAT "\n", result);
#endif
PG_RETURN_CASH(result);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册