UNPKG

d3

Version:

A small, free JavaScript library for manipulating documents based on data.

86 lines (71 loc) 2.63 kB
// TODO align d3.format = function(specifier) { var match = d3_format_re.exec(specifier), fill = match[1] || " ", sign = match[3] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], percentage = false, integer = false; if (precision) precision = precision.substring(1); if (zfill) { fill = "0"; // TODO align = "="; if (comma) width -= Math.floor((width - 1) / 4); } switch (type) { case "n": comma = true; type = "g"; break; case "%": percentage = true; type = "f"; break; case "p": percentage = true; type = "r"; break; case "d": integer = true; precision = "0"; break; } type = d3_format_types[type] || d3_format_typeDefault; return function(value) { var number = percentage ? value * 100 : +value, negative = (number < 0) && (number = -number) ? "\u2212" : sign; // Return the empty string for floats formatted as ints. if (integer && (number % 1)) return ""; // Convert the input value to the desired precision. value = type(number, precision); // If the fill character is 0, the sign and group is applied after the fill. if (zfill) { var length = value.length + negative.length; if (length < width) value = new Array(width - length + 1).join(fill) + value; if (comma) value = d3_format_group(value); value = negative + value; } // Otherwise (e.g., space-filling), the sign and group is applied before. else { if (comma) value = d3_format_group(value); value = negative + value; var length = value.length; if (length < width) value = new Array(width - length + 1).join(fill) + value; } if (percentage) value += "%"; return value; }; }; // [[fill]align][sign][#][0][width][,][.precision][type] var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; var d3_format_types = { g: function(x, p) { return x.toPrecision(p); }, e: function(x, p) { return x.toExponential(p); }, f: function(x, p) { return x.toFixed(p); }, r: function(x, p) { var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); } }; function d3_format_typeDefault(x) { return x + ""; } // Apply comma grouping for thousands. function d3_format_group(value) { var i = value.lastIndexOf("."), f = i >= 0 ? value.substring(i) : (i = value.length, ""), t = []; while (i > 0) t.push(value.substring(i -= 3, i + 3)); return t.reverse().join(",") + f; }