aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/numeric.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/numeric.c')
-rw-r--r--src/backend/utils/adt/numeric.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
index b78451dda01..64eb0f8d16e 100644
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -627,6 +627,44 @@ numeric_out_sci(Numeric num, int scale)
}
/*
+ * numeric_normalize() -
+ *
+ * Output function for numeric data type without trailing zeroes.
+ */
+char *
+numeric_normalize(Numeric num)
+{
+ NumericVar x;
+ char *str;
+ int orig, last;
+
+ /*
+ * Handle NaN
+ */
+ if (NUMERIC_IS_NAN(num))
+ return pstrdup("NaN");
+
+ init_var_from_num(num, &x);
+
+ str = get_str_from_var(&x);
+
+ orig = last = strlen(str) - 1;
+
+ for (;;)
+ {
+ if (last == 0 || str[last] != '0')
+ break;
+
+ last--;
+ }
+
+ if (last > 0 && last != orig)
+ str[last] = '\0';
+
+ return str;
+}
+
+/*
* numeric_recv - converts external binary format to numeric
*
* External format is a sequence of int16's: