ng-number-formatter
Version:
Angular Number Formatter - formats the number into human readable format when in Thousands, Millions and Billions.
195 lines (194 loc) • 18.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component } from '@angular/core';
var NgNumberFormatterComponent = /** @class */ (function () {
function NgNumberFormatterComponent() {
}
/**
* @return {?}
*/
NgNumberFormatterComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var incomingString = this.ngNumber.toString();
/** @type {?} */
var incomingNumber = parseFloat(incomingString);
if (isNaN(incomingNumber)) {
// if its not a number then return as it is!
this.ngOutputNumber = incomingString;
}
else {
// handling minus sign for negative numbers
this.ngOutputNumber = (incomingNumber > 0) ? '' : '-';
incomingNumber = Math.abs(incomingNumber);
switch (this.ngFormat) {
case 'emoji':
this.ngOutputNumber += this.emojifyNumber(incomingNumber);
break;
case 'comma':
this.ngOutputNumber += this.numberWithCommas(incomingNumber);
break;
case 'metrics-name':
this.ngOutputNumber += this.numberWithMetricsName(incomingNumber);
break;
case 'metrics-symbol':
this.ngOutputNumber += this.numberWithMetricsSymbol(incomingNumber);
break;
default:
// metrics symbol based (K thousand, M million, B billion)
this.ngOutputNumber += this.numberWithMetricsSymbol(incomingNumber);
// if someone sets the ngFormat value not as string or other than the expexted formats
// console.log(`Ng-Number-Formatter: String value is requried for the property ngFormat ['', 'metrics-symbol', 'metrics-name', 'comma', 'emoji']`);
break;
}
}
};
/**
* @param {?} num
* @return {?}
*/
NgNumberFormatterComponent.prototype.emojifyNumber = /**
* @param {?} num
* @return {?}
*/
function (num) {
/** @type {?} */
var emojifiedString = '';
/** @type {?} */
var emojiArray = ['0️⃣', '1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟'];
if (num <= 10) {
emojifiedString = emojiArray[num];
}
else {
/** @type {?} */
var numString = num.toString();
for (var i = 0; i < numString.length; i++) {
emojifiedString += isNaN(numString.charAt(i)) ? numString.charAt(i) : emojiArray[numString.charAt(i)];
}
}
return emojifiedString;
};
/**
* @param {?} num
* @return {?}
*/
NgNumberFormatterComponent.prototype.beautifyNumber = /**
* @param {?} num
* @return {?}
*/
function (num) {
/** @type {?} */
var numString = num;
if (num > 0) {
if (num % 10 == 1 && num != 11)
numString = num + "st";
if (num % 10 == 2 && num != 12)
numString = num + "nd";
if (num % 10 == 3 && num != 13)
numString = num + "rd";
if ((num % 10 != 1 && num % 10 != 2 && num % 10 != 3) || (num == 11 || num == 12 || num == 13))
numString = num + "th";
}
return numString;
};
/**
* @param {?} num
* @return {?}
*/
NgNumberFormatterComponent.prototype.numberWithCommas = /**
* @param {?} num
* @return {?}
*/
function (num) {
// setting maximum to 15, so that its the maximum value possible for JS
return num.toLocaleString('en-US', { maximumFractionDigits: 15 });
};
/**
* @param {?} num
* @param {?=} digits
* @return {?}
*/
NgNumberFormatterComponent.prototype.numberWithMetricsName = /**
* @param {?} num
* @param {?=} digits
* @return {?}
*/
function (num, digits) {
if (digits === void 0) { digits = 1; }
/** @type {?} */
var si = [
{ value: 1E24, symbol: " septillion" },
{ value: 1E21, symbol: " sextillion" },
{ value: 1E18, symbol: " quintillion" },
{ value: 1E15, symbol: " quadrillion" },
{ value: 1E12, symbol: " trillion" },
{ value: 1E9, symbol: " billion" },
{ value: 1E6, symbol: " million" },
{ value: 1E3, symbol: " thousand" }
];
/** @type {?} */
var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
for (var i = 0; i < si.length; i++) {
if (num >= si[i].value) {
return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol;
}
}
return num.toFixed(digits).replace(rx, "$1");
};
/**
* @param {?} num
* @param {?=} digits
* @return {?}
*/
NgNumberFormatterComponent.prototype.numberWithMetricsSymbol = /**
* @param {?} num
* @param {?=} digits
* @return {?}
*/
function (num, digits) {
if (digits === void 0) { digits = 1; }
/** @type {?} */
var si = [
{ value: 1E24, symbol: "Y" },
{ value: 1E21, symbol: "Z" },
{ value: 1E18, symbol: "E" },
{ value: 1E15, symbol: "P" },
{ value: 1E12, symbol: "T" },
{ value: 1E9, symbol: "B" },
{ value: 1E6, symbol: "M" },
{ value: 1E3, symbol: "K" }
];
/** @type {?} */
var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
for (var i = 0; i < si.length; i++) {
if (num >= si[i].value) {
return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol;
}
}
return num.toFixed(digits).replace(rx, "$1");
};
NgNumberFormatterComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-number-formatter',
inputs: ['ngNumber', 'ngFormat'],
template: '<span>{{ngOutputNumber}}</span>',
},] },
];
/** @nocollapse */
NgNumberFormatterComponent.ctorParameters = function () { return []; };
return NgNumberFormatterComponent;
}());
export { NgNumberFormatterComponent };
if (false) {
/** @type {?} */
NgNumberFormatterComponent.prototype.ngNumber;
/** @type {?} */
NgNumberFormatterComponent.prototype.ngFormat;
/** @type {?} */
NgNumberFormatterComponent.prototype.ngOutputNumber;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbnVtYmVyLWZvcm1hdHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1udW1iZXItZm9ybWF0dGVyLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL25nLW51bWJlci1mb3JtYXR0ZXIvbmctbnVtYmVyLWZvcm1hdHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7O0lBYWhEO0tBQWlCOzs7O0lBRWpCLDZDQUFROzs7SUFBUjs7UUFFRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDOztRQUM5QyxJQUFJLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEQsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUU7O1lBRXpCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1NBQ3RDO2FBQU07O1lBRUwsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDdEQsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUMsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNyQixLQUFLLE9BQU87b0JBQ1YsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUMxRCxNQUFNO2dCQUNSLEtBQUssT0FBTztvQkFDVixJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDN0QsTUFBTTtnQkFDUixLQUFLLGNBQWM7b0JBQ2pCLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FB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cG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctbnVtYmVyLWZvcm1hdHRlcicsXG4gIGlucHV0czogWyduZ051bWJlcicsICduZ0Zvcm1hdCddLFxuICB0ZW1wbGF0ZTogJzxzcGFuPnt7bmdPdXRwdXROdW1iZXJ9fTwvc3Bhbj4nLFxufSlcblxuZXhwb3J0IGNsYXNzIE5nTnVtYmVyRm9ybWF0dGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbmdOdW1iZXI6IG51bWJlciB8IHN0cmluZztcbiAgbmdGb3JtYXQ6IHN0cmluZztcbiAgbmdPdXRwdXROdW1iZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRvIHByb2Nlc3MgYm90aCBudW1iZXJzIGFuZCBzdHJpbmdzXG4gICAgdmFyIGluY29taW5nU3RyaW5nID0gdGhpcy5uZ051bWJlci50b1N0cmluZygpO1xuICAgIHZhciBpbmNvbWluZ051bWJlciA9IHBhcnNlRmxvYXQoaW5jb21pbmdTdHJpbmcpO1xuICAgIGlmIChpc05hTihpbmNvbWluZ051bWJlcikpIHtcbiAgICAgIC8vIGlmIGl0cyBub3QgYSBudW1iZXIgdGhlbiByZXR1cm4gYXMgaXQgaXMhXG4gICAgICB0aGlzLm5nT3V0cHV0TnVtYmVyID0gaW5jb21pbmdTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhhbmRsaW5nIG1pbnVzIHNpZ24gZm9yIG5lZ2F0aXZlIG51bWJlcnNcbiAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgPSAoaW5jb21pbmdOdW1iZXIgPiAwKSA/ICcnIDogJy0nO1xuICAgICAgaW5jb21pbmdOdW1iZXIgPSBNYXRoLmFicyhpbmNvbWluZ051bWJlcik7XG4gICAgICBzd2l0Y2ggKHRoaXMubmdGb3JtYXQpIHtcbiAgICAgICAgY2FzZSAnZW1vamknOlxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5lbW9qaWZ5TnVtYmVyKGluY29taW5nTnVtYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5udW1iZXJXaXRoQ29tbWFzKGluY29taW5nTnVtYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWV0cmljcy1uYW1lJzpcbiAgICAgICAgICB0aGlzLm5nT3V0cHV0TnVtYmVyICs9IHRoaXMubnVtYmVyV2l0aE1ldHJpY3NOYW1lKGluY29taW5nTnVtYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWV0cmljcy1zeW1ib2wnOlxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5udW1iZXJXaXRoTWV0cmljc1N5bWJvbChpbmNvbWluZ051bWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gbWV0cmljcyBzeW1ib2wgYmFzZWQgKEsgdGhvdXNhbmQsIE0gbWlsbGlvbiwgQiBiaWxsaW9uKVxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5udW1iZXJXaXRoTWV0cmljc1N5bWJvbChpbmNvbWluZ051bWJlcik7XG4gICAgICAgICAgLy8gaWYgc29tZW9uZSBzZXRzIHRoZSBuZ0Zvcm1hdCB2YWx1ZSBub3QgYXMgc3RyaW5nIG9yIG90aGVyIHRoYW4gdGhlIGV4cGV4dGVkIGZvcm1hdHNcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgTmctTnVtYmVyLUZvcm1hdHRlcjogU3RyaW5nIHZhbHVlIGlzIHJlcXVyaWVkwqBmb3IgdGhlIHByb3BlcnR5IG5nRm9ybWF0IFsnJywgJ21ldHJpY3Mtc3ltYm9sJywgJ21ldHJpY3MtbmFtZScsICdjb21tYScsICdlbW9qaSddYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW1vamlmeU51bWJlcihudW0pIHtcbiAgICB2YXIgZW1vamlmaWVkU3RyaW5nID0gJyc7XG4gICAgdmFyIGVtb2ppQXJyYXkgPSBbJzDvuI/ig6MnLCAnMe+4j+KDoycsICcy77iP4oOjJywgJzPvuI/ig6MnLCAnNO+4j+KDoycsICc177iP4oOjJywgJzbvuI/ig6MnLCAnN++4j+KDoycsICc477iP4oOjJywgJznvuI/ig6MnLCAn77+977+977+977+977+977+9J107XG4gICAgaWYgKG51bSA8PSAxMCkge1xuICAgICAgZW1vamlmaWVkU3RyaW5nID0gZW1vamlBcnJheVtudW1dO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbnVtU3RyaW5nID0gbnVtLnRvU3RyaW5nKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbW9qaWZpZWRTdHJpbmcgKz0gaXNOYU4obnVtU3RyaW5nLmNoYXJBdChpKSkgPyBudW1TdHJpbmcuY2hhckF0KGkpIDogZW1vamlBcnJheVtudW1TdHJpbmcuY2hhckF0KGkpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW1vamlmaWVkU3RyaW5nO1xuICB9XG5cbiAgYmVhdXRpZnlOdW1iZXIobnVtKSB7XG4gICAgdmFyIG51bVN0cmluZyA9IG51bTtcbiAgICBpZiAobnVtID4gMCkge1xuICAgICAgaWYgKG51bSAlIDEwID09IDEgJiYgbnVtICE9IDExKSBudW1TdHJpbmcgPSBgJHtudW19c3RgO1xuICAgICAgaWYgKG51bSAlIDEwID09IDIgJiYgbnVtICE9IDEyKSBudW1TdHJpbmcgPSBgJHtudW19bmRgO1xuICAgICAgaWYgKG51bSAlIDEwID09IDMgJiYgbnVtICE9IDEzKSBudW1TdHJpbmcgPSBgJHtudW19cmRgO1xuICAgICAgaWYgKChudW0gJSAxMCAhPSAxICYmIG51bSAlIDEwICE9IDIgJiYgbnVtICUgMTAgIT0gMykgfHwgKG51bSA9PSAxMSB8fCBudW0gPT0gMTIgfHwgbnVtID09IDEzKSkgbnVtU3RyaW5nID0gYCR7bnVtfXRoYDtcbiAgICB9XG4gICAgcmV0dXJuIG51bVN0cmluZztcbiAgfVxuXG4gIG51bWJlcldpdGhDb21tYXMobnVtKSB7XG4gICAgLy8gc2V0dGluZyBtYXhpbXVtIHRvIDE1LCBzbyB0aGF0IGl0cyB0aGUgbWF4aW11bSB2YWx1ZSBwb3NzaWJsZSBmb3IgSlNcbiAgICByZXR1cm4gbnVtLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAxNSB9KTtcbiAgfVxuXG4gIG51bWJlcldpdGhNZXRyaWNzTmFtZShudW0sIGRpZ2l0cyA9IDEpIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXRhLVxuICAgIHZhciBzaSA9IFtcbiAgICAgIHsgdmFsdWU6IDFFMjQsIHN5bWJvbDogXCIgc2VwdGlsbGlvblwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTIxLCBzeW1ib2w6IFwiIHNleHRpbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUUxOCwgc3ltYm9sOiBcIiBxdWludGlsbGlvblwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTE1LCBzeW1ib2w6IFwiIHF1YWRyaWxsaW9uXCIgfSxcbiAgICAgIHsgdmFsdWU6IDFFMTIsIHN5bWJvbDogXCIgdHJpbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUU5LCBzeW1ib2w6IFwiIGJpbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUU2LCBzeW1ib2w6IFwiIG1pbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUUzLCBzeW1ib2w6IFwiIHRob3VzYW5kXCIgfVxuICAgIF0sIHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobnVtID49IHNpW2ldLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiAobnVtIC8gc2lbaV0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaV0uc3ltYm9sO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpO1xuICB9XG5cbiAgbnVtYmVyV2l0aE1ldHJpY3NTeW1ib2wobnVtLCBkaWdpdHMgPSAxKSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGV0YS1cbiAgICB2YXIgc2kgPSBbXG4gICAgICB7IHZhbHVlOiAxRTI0LCBzeW1ib2w6IFwiWVwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTIxLCBzeW1ib2w6IFwiWlwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTE4LCBzeW1ib2w6IFwiRVwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTE1LCBzeW1ib2w6IFwiUFwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTEyLCBzeW1ib2w6IFwiVFwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTksIHN5bWJvbDogXCJCXCIgfSxcbiAgICAgIHsgdmFsdWU6IDFFNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgICAgeyB2YWx1ZTogMUUzLCBzeW1ib2w6IFwiS1wiIH1cbiAgICBdLCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG51bSA+PSBzaVtpXS52YWx1ZSkge1xuICAgICAgICByZXR1cm4gKG51bSAvIHNpW2ldLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2ldLnN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKTtcbiAgfVxufSJdfQ==