From 20dc83d611faeca81f12ebb184fcd758f33da041 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Tue, 8 Jun 2010 17:21:14 -0700 Subject: [PATCH] Number format now supports negative numbers. The minus sign was being inadvertantly dropped from negative numbers. In addition to fixing this bug, you can now customize the negative prefix and suffix, which defaults to the minus sign (\u2212). --- src/text/NumberFormat.js | 29 ++++++-- tests/mark/transition.html | 4 +- tests/testify.css | 1 + tests/text/format-number.html | 120 ++++++++++++++++++---------------- 4 files changed, 91 insertions(+), 63 deletions(-) diff --git a/src/text/NumberFormat.js b/src/text/NumberFormat.js index 4a041945..863d2c08 100644 --- a/src/text/NumberFormat.js +++ b/src/text/NumberFormat.js @@ -20,7 +20,9 @@ pv.Format.number = function() { padf = "0", // default fraction pad padg = true, // whether group separator affects integer padding decimal = ".", // default decimal separator - group = ","; // default group separator + group = ",", // default group separator + np = "\u2212", // default negative prefix + ns = ""; // default negative suffix /** @private */ function format(x) { @@ -29,12 +31,12 @@ pv.Format.number = function() { var s = String(Math.abs(x)).split("."); /* Pad, truncate and group the integral part. */ - var i = s[0], n = (x < 0) ? "-" : ""; + var i = s[0]; if (i.length > maxi) i = i.substring(i.length - maxi); - if (padg && (i.length < mini)) i = n + new Array(mini - i.length + 1).join(padi) + i; + if (padg && (i.length < mini)) i = new Array(mini - i.length + 1).join(padi) + i; if (i.length > 3) i = i.replace(/\B(?=(?:\d{3})+(?!\d))/g, group); - if (!padg && (i.length < mins)) i = new Array(mins - i.length + 1).join(padi) + n + i; - s[0] = i; + if (!padg && (i.length < mins)) i = new Array(mins - i.length + 1).join(padi) + i; + s[0] = x < 0 ? np + i + ns : i; /* Pad the fractional part. */ var f = s[1] || ""; @@ -204,5 +206,22 @@ pv.Format.number = function() { return group; }; + /** + * Sets or gets the negative prefix and suffix. The default negative prefix is + * "−", and the default negative suffix is the empty string. + * + * @param {string} [x] the negative prefix. + * @param {string} [y] the negative suffix. + * @returns {pv.Format.number} this or the current negative format. + */ + format.negativeAffix = function(x, y) { + if (arguments.length) { + np = String(x || ""); + ns = String(y || ""); + return this; + } + return [np, ns]; + }; + return format; }; diff --git a/tests/mark/transition.html b/tests/mark/transition.html index 886cad92..ee28f74d 100644 --- a/tests/mark/transition.html +++ b/tests/mark/transition.html @@ -44,7 +44,7 @@ > -
+

+ + +


     
+var i, text = "";
+
+text += ">>> pv.Format.number()\n";
+text += "input\texpected\tactual\n";
+
+i = pv.Format.number()(1);
+text += "1\t1\t" + i + "\n";
+
+i = pv.Format.number()(0);
+text += "0\t0\t" + i + "\n";
+
+i = pv.Format.number()(-.5);
+text += "-.5\t0\t" + i + "\n";
+
+i = pv.Format.number()(-.6);
+text += "-.6\t-1\t" + i + "\n";
+
+i = pv.Format.number()(-1);
+text += "-1\t-1\t" + i + "\n";
+
+i = pv.Format.number().negativeAffix("(", ")").integerDigits(2)(-1);
+text += "-1\t(01)\t" + i + "\n";
+
+i = pv.Format.number().integerDigits(2)(-1);
+text += "-1\t-01\t" + i + "\n";
+
+i = pv.Format.number()(NaN);
+text += "NaN\tNaN\t" + i + "\n";
+
+i = pv.Format.number()(1234.56);
+text += "1234.56\t1,235\t" + i + "\n";
+
+i = pv.Format.number().fractionDigits(2)(12345678.90);
+text += "12345678.90\t12,345,678.90\t" + i + "\n";
+
+i = pv.Format.number().fractionDigits(0, Infinity)(12345678.90);
+text += "12345678.90\t12,345,678.9\t" + i + "\n";
+
+i = pv.Format.number().fractionDigits(0, Infinity)(123456789.01);
+text += "123456789.01\t123,456,789.01\t" + i + "\n";
+
+i = pv.Format.number().group(" ").decimal(",").fractionDigits(2)(12345678.90);
+text += "12345678.90\t12 345 678,90\t" + i + "\n";
+
+i = pv.Format.number().integerDigits(2).fractionDigits(2)(999.9949);
+text += "999.9949\t99.99\t" + i + "\n";
+
+i = pv.Format.number().integerDigits(5).integerPad("0").fractionDigits(2)(4999.9);
+text += "4999.9\t04,999.90\t" + i + "\n";
+
+i = pv.Format.number().integerDigits(5).integerPad(" ").fractionDigits(2)(4999.9);
+text += "4999.9\t 4,999.90\t" + i + "\n";
+
+i = pv.Format.number().integerDigits(2).parse(999.9949);
+text += "999.9949\t100\t" + i + "\n";
+
+i = pv.Format.number().parse(999.9949);
+text += "999.9949\t1000\t" + i + "\n";
+
+testify(text);
+