in TestApplications/Web/js/lib/components/d3-3.4.13/src/locale/number-format.js [7:136]
function d3_locale_numberFormat(locale) {
var locale_decimal = locale.decimal,
locale_thousands = locale.thousands,
locale_grouping = locale.grouping,
locale_currency = locale.currency,
formatGroup = locale_grouping && locale_thousands ? function(value, width) {
var i = value.length,
t = [],
j = 0,
g = locale_grouping[0],
length = 0;
while (i > 0 && g > 0) {
if (length + g + 1 > width) g = Math.max(1, width - length);
t.push(value.substring(i -= g, i + g));
if ((length += g + 1) > width) break;
g = locale_grouping[j = (j + 1) % locale_grouping.length];
}
return t.reverse().join(locale_thousands);
} : d3_identity;
return function(specifier) {
var match = d3_format_re.exec(specifier),
fill = match[1] || " ",
align = match[2] || ">",
sign = match[3] || "-",
symbol = match[4] || "",
zfill = match[5],
width = +match[6],
comma = match[7],
precision = match[8],
type = match[9],
scale = 1,
prefix = "",
suffix = "",
integer = false,
exponent = true;
if (precision) precision = +precision.substring(1);
if (zfill || fill === "0" && align === "=") {
zfill = fill = "0";
align = "=";
}
switch (type) {
case "n": comma = true; type = "g"; break;
case "%": scale = 100; suffix = "%"; type = "f"; break;
case "p": scale = 100; suffix = "%"; type = "r"; break;
case "b":
case "o":
case "x":
case "X": if (symbol === "#") prefix = "0" + type.toLowerCase();
case "c": exponent = false;
case "d": integer = true; precision = 0; break;
case "s": scale = -1; type = "r"; break;
}
if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1];
// If no precision is specified for r, fallback to general notation.
if (type == "r" && !precision) type = "g";
// Ensure that the requested precision is in the supported range.
if (precision != null) {
if (type == "g") precision = Math.max(1, Math.min(21, precision));
else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
}
type = d3_format_types.get(type) || d3_format_typeDefault;
var zcomma = zfill && comma;
return function(value) {
var fullSuffix = suffix;
// Return the empty string for floats formatted as ints.
if (integer && (value % 1)) return "";
// Convert negative to positive, and record the sign prefix.
var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign;
// Apply the scale, computing it from the value's exponent for si format.
// Preserve the existing suffix, if any, such as the currency symbol.
if (scale < 0) {
var unit = d3.formatPrefix(value, precision);
value = unit.scale(value);
fullSuffix = unit.symbol + suffix;
} else {
value *= scale;
}
// Convert to the desired precision.
value = type(value, precision);
// Break the value into the integer part (before) and decimal part (after).
var i = value.lastIndexOf("."),
before,
after;
if (i < 0) {
// If there is no decimal, break on "e" where appropriate.
var j = exponent ? value.lastIndexOf("e") : -1;
if (j < 0) before = value, after = "";
else before = value.substring(0, j), after = value.substring(j);
} else {
before = value.substring(0, i);
after = locale_decimal + value.substring(i + 1);
}
// If the fill character is not "0", grouping is applied before padding.
if (!zfill && comma) before = formatGroup(before, Infinity);
var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length),
padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
// If the fill character is "0", grouping is applied after padding.
if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);
// Apply prefix.
negative += prefix;
// Rejoin integer and decimal parts.
value = before + after;
return (align === "<" ? negative + value + padding
: align === ">" ? padding + negative + value
: align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length)
: negative + (zcomma ? value : padding + value)) + fullSuffix;
};
};
}