UNPKG

ng-number-formatter

Version:

Angular Number Formatter - formats the number into human readable format when in Thousands, Millions and Billions.

235 lines (227 loc) 22.2 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) : typeof define === 'function' && define.amd ? define('ng-number-formatter', ['exports', '@angular/core', '@angular/common'], factory) : (factory((global['ng-number-formatter'] = {}),global.ng.core,global.ng.common)); }(this, (function (exports,core,common) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ 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: core.Component, args: [{ selector: 'ng-number-formatter', inputs: ['ngNumber', 'ngFormat'], template: '<span>{{ngOutputNumber}}</span>', },] }, ]; /** @nocollapse */ NgNumberFormatterComponent.ctorParameters = function () { return []; }; return NgNumberFormatterComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var NgNumberFormatterModule = /** @class */ (function () { function NgNumberFormatterModule() { } NgNumberFormatterModule.decorators = [ { type: core.NgModule, args: [{ imports: [ common.CommonModule ], declarations: [ NgNumberFormatterComponent ], exports: [ NgNumberFormatterComponent ] },] }, ]; return NgNumberFormatterModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ exports.NgNumberFormatterModule = NgNumberFormatterModule; exports.ɵa = NgNumberFormatterComponent; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctbnVtYmVyLWZvcm1hdHRlci51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25nLW51bWJlci1mb3JtYXR0ZXIvc3JjL2FwcC9tb2R1bGVzL25nLW51bWJlci1mb3JtYXR0ZXIvbmctbnVtYmVyLWZvcm1hdHRlci5jb21wb25lbnQudHMiLCJuZzovL25nLW51bWJlci1mb3JtYXR0ZXIvc3JjL2FwcC9tb2R1bGVzL25nLW51bWJlci1mb3JtYXR0ZXIvbmctbnVtYmVyLWZvcm1hdHRlci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctbnVtYmVyLWZvcm1hdHRlcicsXG4gIGlucHV0czogWyduZ051bWJlcicsICduZ0Zvcm1hdCddLFxuICB0ZW1wbGF0ZTogJzxzcGFuPnt7bmdPdXRwdXROdW1iZXJ9fTwvc3Bhbj4nLFxufSlcblxuZXhwb3J0IGNsYXNzIE5nTnVtYmVyRm9ybWF0dGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgbmdOdW1iZXI6IG51bWJlciB8IHN0cmluZztcbiAgbmdGb3JtYXQ6IHN0cmluZztcbiAgbmdPdXRwdXROdW1iZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRvIHByb2Nlc3MgYm90aCBudW1iZXJzIGFuZCBzdHJpbmdzXG4gICAgdmFyIGluY29taW5nU3RyaW5nID0gdGhpcy5uZ051bWJlci50b1N0cmluZygpO1xuICAgIHZhciBpbmNvbWluZ051bWJlciA9IHBhcnNlRmxvYXQoaW5jb21pbmdTdHJpbmcpO1xuICAgIGlmIChpc05hTihpbmNvbWluZ051bWJlcikpIHtcbiAgICAgIC8vIGlmIGl0cyBub3QgYSBudW1iZXIgdGhlbiByZXR1cm4gYXMgaXQgaXMhXG4gICAgICB0aGlzLm5nT3V0cHV0TnVtYmVyID0gaW5jb21pbmdTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhhbmRsaW5nIG1pbnVzIHNpZ24gZm9yIG5lZ2F0aXZlIG51bWJlcnNcbiAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgPSAoaW5jb21pbmdOdW1iZXIgPiAwKSA/ICcnIDogJy0nO1xuICAgICAgaW5jb21pbmdOdW1iZXIgPSBNYXRoLmFicyhpbmNvbWluZ051bWJlcik7XG4gICAgICBzd2l0Y2ggKHRoaXMubmdGb3JtYXQpIHtcbiAgICAgICAgY2FzZSAnZW1vamknOlxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5lbW9qaWZ5TnVtYmVyKGluY29taW5nTnVtYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY29tbWEnOlxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5udW1iZXJXaXRoQ29tbWFzKGluY29taW5nTnVtYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWV0cmljcy1uYW1lJzpcbiAgICAgICAgICB0aGlzLm5nT3V0cHV0TnVtYmVyICs9IHRoaXMubnVtYmVyV2l0aE1ldHJpY3NOYW1lKGluY29taW5nTnVtYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbWV0cmljcy1zeW1ib2wnOlxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5udW1iZXJXaXRoTWV0cmljc1N5bWJvbChpbmNvbWluZ051bWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gbWV0cmljcyBzeW1ib2wgYmFzZWQgKEsgdGhvdXNhbmQsIE0gbWlsbGlvbiwgQiBiaWxsaW9uKVxuICAgICAgICAgIHRoaXMubmdPdXRwdXROdW1iZXIgKz0gdGhpcy5udW1iZXJXaXRoTWV0cmljc1N5bWJvbChpbmNvbWluZ051bWJlcik7XG4gICAgICAgICAgLy8gaWYgc29tZW9uZSBzZXRzIHRoZSBuZ0Zvcm1hdCB2YWx1ZSBub3QgYXMgc3RyaW5nIG9yIG90aGVyIHRoYW4gdGhlIGV4cGV4dGVkIGZvcm1hdHNcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgTmctTnVtYmVyLUZvcm1hdHRlcjogU3RyaW5nIHZhbHVlIGlzIHJlcXVyaWVkwqBmb3IgdGhlIHByb3BlcnR5IG5nRm9ybWF0IFsnJywgJ21ldHJpY3Mtc3ltYm9sJywgJ21ldHJpY3MtbmFtZScsICdjb21tYScsICdlbW9qaSddYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW1vamlmeU51bWJlcihudW0pIHtcbiAgICB2YXIgZW1vamlmaWVkU3RyaW5nID0gJyc7XG4gICAgdmFyIGVtb2ppQXJyYXkgPSBbJzDvuI/ig6MnLCAnMe+4j+KDoycsICcy77iP4oOjJywgJzPvuI/ig6MnLCAnNO+4j+KDoycsICc177iP4oOjJywgJzbvuI/ig6MnLCAnN++4j+KDoycsICc477iP4oOjJywgJznvuI/ig6MnLCAn77+977+977+977+977+977+9J107XG4gICAgaWYgKG51bSA8PSAxMCkge1xuICAgICAgZW1vamlmaWVkU3RyaW5nID0gZW1vamlBcnJheVtudW1dO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbnVtU3RyaW5nID0gbnVtLnRvU3RyaW5nKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbW9qaWZpZWRTdHJpbmcgKz0gaXNOYU4obnVtU3RyaW5nLmNoYXJBdChpKSkgPyBudW1TdHJpbmcuY2hhckF0KGkpIDogZW1vamlBcnJheVtudW1TdHJpbmcuY2hhckF0KGkpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW1vamlmaWVkU3RyaW5nO1xuICB9XG5cbiAgYmVhdXRpZnlOdW1iZXIobnVtKSB7XG4gICAgdmFyIG51bVN0cmluZyA9IG51bTtcbiAgICBpZiAobnVtID4gMCkge1xuICAgICAgaWYgKG51bSAlIDEwID09IDEgJiYgbnVtICE9IDExKSBudW1TdHJpbmcgPSBgJHtudW19c3RgO1xuICAgICAgaWYgKG51bSAlIDEwID09IDIgJiYgbnVtICE9IDEyKSBudW1TdHJpbmcgPSBgJHtudW19bmRgO1xuICAgICAgaWYgKG51bSAlIDEwID09IDMgJiYgbnVtICE9IDEzKSBudW1TdHJpbmcgPSBgJHtudW19cmRgO1xuICAgICAgaWYgKChudW0gJSAxMCAhPSAxICYmIG51bSAlIDEwICE9IDIgJiYgbnVtICUgMTAgIT0gMykgfHwgKG51bSA9PSAxMSB8fCBudW0gPT0gMTIgfHwgbnVtID09IDEzKSkgbnVtU3RyaW5nID0gYCR7bnVtfXRoYDtcbiAgICB9XG4gICAgcmV0dXJuIG51bVN0cmluZztcbiAgfVxuXG4gIG51bWJlcldpdGhDb21tYXMobnVtKSB7XG4gICAgLy8gc2V0dGluZyBtYXhpbXVtIHRvIDE1LCBzbyB0aGF0IGl0cyB0aGUgbWF4aW11bSB2YWx1ZSBwb3NzaWJsZSBmb3IgSlNcbiAgICByZXR1cm4gbnVtLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAxNSB9KTtcbiAgfVxuXG4gIG51bWJlcldpdGhNZXRyaWNzTmFtZShudW0sIGRpZ2l0cyA9IDEpIHtcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QZXRhLVxuICAgIHZhciBzaSA9IFtcbiAgICAgIHsgdmFsdWU6IDFFMjQsIHN5bWJvbDogXCIgc2VwdGlsbGlvblwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTIxLCBzeW1ib2w6IFwiIHNleHRpbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUUxOCwgc3ltYm9sOiBcIiBxdWludGlsbGlvblwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTE1LCBzeW1ib2w6IFwiIHF1YWRyaWxsaW9uXCIgfSxcbiAgICAgIHsgdmFsdWU6IDFFMTIsIHN5bWJvbDogXCIgdHJpbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUU5LCBzeW1ib2w6IFwiIGJpbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUU2LCBzeW1ib2w6IFwiIG1pbGxpb25cIiB9LFxuICAgICAgeyB2YWx1ZTogMUUzLCBzeW1ib2w6IFwiIHRob3VzYW5kXCIgfVxuICAgIF0sIHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobnVtID49IHNpW2ldLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiAobnVtIC8gc2lbaV0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaV0uc3ltYm9sO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpO1xuICB9XG5cbiAgbnVtYmVyV2l0aE1ldHJpY3NTeW1ib2wobnVtLCBkaWdpdHMgPSAxKSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGV0YS1cbiAgICB2YXIgc2kgPSBbXG4gICAgICB7IHZhbHVlOiAxRTI0LCBzeW1ib2w6IFwiWVwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTIxLCBzeW1ib2w6IFwiWlwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTE4LCBzeW1ib2w6IFwiRVwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTE1LCBzeW1ib2w6IFwiUFwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTEyLCBzeW1ib2w6IFwiVFwiIH0sXG4gICAgICB7IHZhbHVlOiAxRTksIHN5bWJvbDogXCJCXCIgfSxcbiAgICAgIHsgdmFsdWU6IDFFNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgICAgeyB2YWx1ZTogMUUzLCBzeW1ib2w6IFwiS1wiIH1cbiAgICBdLCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG51bSA+PSBzaVtpXS52YWx1ZSkge1xuICAgICAgICByZXR1cm4gKG51bSAvIHNpW2ldLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2ldLnN5bWJvbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKTtcbiAgfVxufSIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdOdW1iZXJGb3JtYXR0ZXJDb21wb25lbnQgfSBmcm9tICcuL25nLW51bWJlci1mb3JtYXR0ZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBOZ051bWJlckZvcm1hdHRlckNvbXBvbmVudFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgTmdOdW1iZXJGb3JtYXR0ZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ051bWJlckZvcm1hdHRlck1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJDb21wb25lbnQiLCJOZ01vZHVsZSIsIkNvbW1vbk1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBYUU7U0FBaUI7Ozs7UUFFakIsNkNBQVE7OztZQUFSOztnQkFFRSxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDOztnQkFDOUMsSUFBSSxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTs7b0JBRXpCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO2lCQUN0QztxQkFBTTs7b0JBRUwsSUFBSSxD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