prefix-si
Version:
SI, IEC, BS1852 compatible number formatter
83 lines (82 loc) • 2.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var typescript_object_utils_1 = require("typescript-object-utils");
var standards = {
si: {
minPrefix: -8,
prefixes: ["y", "z", "a", "f", "p", "n", "μ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"],
base: 1000
},
iec: {
minPrefix: 0,
prefixes: ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"],
base: 1024
},
bs1852_R: {
minPrefix: 0,
prefixes: ["R", "K", "M", "G", "T"],
base: 1000
},
bs1852_F: {
minPrefix: -4,
prefixes: ["p", "n", "μ", "m", "F"],
base: 1000
}
};
var defaults = {
binary: false,
round: 2,
spacer: "",
decimalMark: "."
};
function prefix(value, unit, options) {
options = typescript_object_utils_1.merge(defaults, options || {});
var standard;
if (options.bs1852) {
if (unit === "R") {
standard = standards.bs1852_R;
}
else if (unit === "F") {
standard = standards.bs1852_F;
}
else {
standard = standards.si;
}
}
else {
standard = options.binary ? standards.iec : standards.si;
}
var minPrefix = standard.minPrefix;
var prefixes = standard.prefixes;
var maxPrefix = prefixes.length + minPrefix - 1;
var base = standard.base;
var absValue = Math.abs(value);
var exponent = absValue ? Math.floor(Math.log(absValue) / Math.log(base)) : 0;
exponent = Math.min(maxPrefix, Math.max(minPrefix, exponent));
var prefix = prefixes[exponent - minPrefix];
var prefixBase = Math.pow(base, exponent);
var val = value / prefixBase;
var valString = String(val);
unit = unit ? unit : "";
if (options.fixed) {
valString = val.toFixed(options.fixed);
}
else if (options.precision) {
valString = val.toPrecision(options.precision);
}
else {
var roundPow = Math.pow(10, +options.round);
valString = String(Math.round(val * roundPow) / roundPow);
}
if (options.bs1852) {
var parts = valString.split(".");
if (parts.length == 2) {
return (parts[0] == "0" ? "" : parts[0]) + (prefix ? prefix : (unit ? unit : options.decimalMark)) + (parts[1]);
}
else {
return valString + (prefix ? prefix : unit) + (valString.length == 1 ? "0" : "");
}
}
return valString.replace(".", options.decimalMark) + options.spacer + prefix + unit;
}
exports.prefix = prefix;