Skip to content
This repository has been archived by the owner on Apr 30, 2023. It is now read-only.

Commit

Permalink
Number format now supports negative numbers.
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
Mike Bostock committed Jun 9, 2010
1 parent 4fc5aac commit 20dc83d
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 63 deletions.
29 changes: 24 additions & 5 deletions src/text/NumberFormat.js
Expand Up @@ -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) {
Expand All @@ -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] || "";
Expand Down Expand Up @@ -204,5 +206,22 @@ pv.Format.number = function() {
return group;
};

/**
* Sets or gets the negative prefix and suffix. The default negative prefix is
* "&minus;", 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} <tt>this</tt> 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;
};
4 changes: 2 additions & 2 deletions tests/mark/transition.html
Expand Up @@ -44,7 +44,7 @@
><label for="slow">Slow</label>
<input type="button" onclick="start();" value="Start">
<input type="button" onclick="stop();" value="Stop">
<br>
<p>
<script type="text/javascript+protovis">

var slow = false,
Expand All @@ -61,7 +61,7 @@
var vis = new pv.Panel()
.width(w)
.height(h)
.margin(20);
.margin(30);

var rule = vis.add(pv.Rule)
.data(function() y1.ticks(20))
Expand Down
1 change: 1 addition & 0 deletions tests/testify.css
Expand Up @@ -3,6 +3,7 @@ table.testify {
font: 14px/134% Courier, monospace;
border-spacing: 0;
margin-bottom: 1em;
white-space: pre;
}

table.testify td {
Expand Down
120 changes: 64 additions & 56 deletions tests/text/format-number.html
Expand Up @@ -2,66 +2,74 @@
<head>
<title>Number Format</title>
<script type="text/javascript" src="../../protovis-d3.2.js"></script>
<script type="text/javascript" src="../testify.js"></script>
<link rel="stylesheet" type="text/css" href="../style.css"/>
<link rel="stylesheet" type="text/css" href="../testify.css"/>
</head>
<body>
<pre id="pre"></pre>
<script type="text/javascript+protovis">

// 1,235
pre.innerHTML += pv.Format.number()
(1234.56) + "\n";

// 12,345,678.90
pre.innerHTML += pv.Format.number()
.fractionDigits(2)
(12345678.90) + "\n";

// 12,345,678.9
pre.innerHTML += pv.Format.number()
.fractionDigits(0, Infinity)
(12345678.90) + "\n";

// 12,345,6789.01
pre.innerHTML += pv.Format.number()
.fractionDigits(0, Infinity)
(123456789.01) + "\n";

// 12 345 678,90
pre.innerHTML += pv.Format.number()
.group(" ")
.decimal(",")
.fractionDigits(2)
(12345678.90) + "\n";

// 99.99
pre.innerHTML += pv.Format.number()
.integerDigits(2)
.fractionDigits(2)
(999.9949) + "\n";

// 04,999.90
pre.innerHTML += pv.Format.number()
.integerDigits(5)
.integerPad("0")
.fractionDigits(2)
(4999.9) + "\n";

// 4,999.90
pre.innerHTML += pv.Format.number()
.integerDigits(5)
.integerPad(" ")
.fractionDigits(2)
(4999.9) + "\n";

// 100
pre.innerHTML += pv.Format.number()
.integerDigits(2)
.parse(999.9949) + "\n";

// 1000
pre.innerHTML += pv.Format.number()
.parse(999.9949) + "\n";

</script>
var i, text = "";

text += ">>> pv.Format.number()\n";
text += "<b>input\texpected\tactual</b>\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);
</script>
</body>
</html>

0 comments on commit 20dc83d

Please sign in to comment.