UNPKG

ontimize-web-ngx

Version:
115 lines 18.2 kB
import { Injectable, Injector } from '@angular/core'; import { Util } from '../util/util'; import { OTranslateService } from './translate/o-translate.service'; import * as i0 from "@angular/core"; export class NumberService { constructor(injector) { this.injector = injector; this.translateService = this.injector.get(OTranslateService); this.minDecimalDigits = NumberService.DEFAULT_DECIMAL_DIGITS; this.maxDecimalDigits = NumberService.DEFAULT_DECIMAL_DIGITS; this.locale = this.translateService.getCurrentLang(); this.translateService.onLanguageChanged.subscribe(() => this.locale = this.translateService.getCurrentLang()); } getIntegerValue(value, args) { const grouping = args ? args.grouping : undefined; if (!Util.isDefined(value)) { return value; } const thousandSeparator = args ? args.thousandSeparator : undefined; const locale = args ? args.locale : undefined; const intValue = Number.parseInt(value, 10); if (Number.isNaN(intValue)) { return void 0; } let formattedIntValue; if (Util.isDefined(locale) || !Util.isDefined(thousandSeparator)) { formattedIntValue = new Intl.NumberFormat(Util.isDefined(locale) ? locale : this.locale).format(intValue); } else { formattedIntValue = String(intValue).toString().replace(/\B(?=(\d{3})+(?!\d))/g, thousandSeparator); } return formattedIntValue; } getRealValue(value, args) { if (!Util.isDefined(value)) { return value; } const locale = args ? args.locale : undefined; const thousandSeparator = args ? args.thousandSeparator : undefined; const decimalSeparator = args ? args.decimalSeparator : undefined; const grouping = args ? args.grouping : false; const minDecimalDigits = args ? args.minDecimalDigits : this.minDecimalDigits; const maxDecimalDigits = args ? args.maxDecimalDigits : this.maxDecimalDigits; let formattedRealValue = value; const useIntlNumberFormat = Util.isDefined(locale) || (!Util.isDefined(thousandSeparator) || !Util.isDefined(decimalSeparator)); if (useIntlNumberFormat) { formattedRealValue = args.truncate ? this.truncate(value, maxDecimalDigits) : null; if (!Util.isDefined(formattedRealValue)) { let formatterArgs = { minimumFractionDigits: minDecimalDigits, maximumFractionDigits: maxDecimalDigits, useGrouping: grouping }; formattedRealValue = new Intl.NumberFormat(Util.isDefined(locale) ? locale : this.locale, formatterArgs).format(value); } } else { formattedRealValue = this.parseRealValue(value, maxDecimalDigits, thousandSeparator, decimalSeparator, grouping); } return formattedRealValue; } getPercentValue(value, args) { const valueBase = args ? args.valueBase : undefined; let parsedValue = value; switch (valueBase) { case 100: break; case 1: default: parsedValue = parsedValue * 100; break; } const formattedPercentValue = this.getRealValue(parsedValue, args) + ' %'; return formattedPercentValue; } truncate(value, maxDecimals) { const stringValue = String(value); const splittedValue = stringValue.split('.'); const decimalsLength = Util.isDefined(splittedValue[1]) ? splittedValue[1].length : null; if (decimalsLength > maxDecimals) { return stringValue.slice(0, splittedValue[0].length + 1 + maxDecimals); } return null; } parseRealValue(value, maxDecimalDigits, thousandSeparator, decimalSeparator, grouping) { let result = value; const realValue = Number.parseFloat(value); if (!Number.isNaN(realValue)) { result = String(realValue); let tmpStr = realValue.toFixed(maxDecimalDigits); tmpStr = tmpStr.replace('.', decimalSeparator); if (grouping) { const parts = tmpStr.split(decimalSeparator); if (parts.length > 0) { parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousandSeparator); result = parts.join(decimalSeparator); } } else { result = tmpStr; } } return result; } } NumberService.DEFAULT_DECIMAL_DIGITS = 2; NumberService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NumberService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); NumberService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NumberService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NumberService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvc2VydmljZXMvbnVtYmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHckQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7QUFLcEUsTUFBTSxPQUFPLGFBQWE7SUFVeEIsWUFBc0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUV0QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU3RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDO1FBQzdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUM7UUFFN0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVUsRUFBRSxJQUFTO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FB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TUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLEdBQUcsTUFBTSxDQUFDO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQXJIYSxvQ0FBc0IsR0FBRyxDQUFDLENBQUM7MkdBRjlCLGFBQWE7K0dBQWIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJUmVhbFBpcGVBcmd1bWVudCB9IGZyb20gJy4uL3BpcGVzL28tcmVhbC5waXBlJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuL3RyYW5zbGF0ZS9vLXRyYW5zbGF0ZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyU2VydmljZSB7XG5cbiAgcHVibGljIHN0YXRpYyBERUZBVUxUX0RFQ0lNQUxfRElHSVRTID0gMjtcblxuICBwcm90ZWN0ZWQgbWluRGVjaW1hbERpZ2l0czogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbWF4RGVjaW1hbERpZ2l0czogbnVtYmVyO1xuICBwcm90ZWN0ZWQgbG9jYWxlOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IE9UcmFuc2xhdGVTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcblxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE9UcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICAvLyBUT0RPOiBpbml0aWFsaXplIGZyb20gY29uZmlnXG4gICAgdGhpcy5taW5EZWNpbWFsRGlnaXRzID0gTnVtYmVyU2VydmljZS5ERUZBVUxUX0RFQ0lNQUxfRElHSVRTO1xuICAgIHRoaXMubWF4RGVjaW1hbERpZ2l0cyA9IE51bWJlclNlcnZpY2UuREVGQVVMVF9ERUNJTUFMX0RJR0lUUztcblxuICAgIHRoaXMubG9jYWxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5nKClcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5ndWFnZUNoYW5nZWQuc3Vic2NyaWJlKCgpID0+XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXRDdXJyZW50TGFuZygpXG4gICAgKTtcbiAgfVxuXG4gIGdldEludGVnZXJWYWx1ZSh2YWx1ZTogYW55LCBhcmdzOiBhbnkpIHtcbiAgICBjb25zdCBncm91cGluZyA9IGFyZ3MgPyBhcmdzLmdyb3VwaW5nIDogdW5kZWZpbmVkO1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHRob3VzYW5kU2VwYXJhdG9yID0gYXJncyA/IGFyZ3MudGhvdXNhbmRTZXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbG9jYWxlID0gYXJncyA/IGFyZ3MubG9jYWxlIDogdW5kZWZpbmVkO1xuICAgIC8vIEVuc3VyZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyXG4gICAgY29uc3QgaW50VmFsdWU6IGFueSA9IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oaW50VmFsdWUpKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICAvLyBGb3JtYXQgdmFsdWVcbiAgICBsZXQgZm9ybWF0dGVkSW50VmFsdWU7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGxvY2FsZSkgfHwgIVV0aWwuaXNEZWZpbmVkKHRob3VzYW5kU2VwYXJhdG9yKSkge1xuICAgICAgZm9ybWF0dGVkSW50VmFsdWUgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoVXRpbC5pc0RlZmluZWQobG9jYWxlKSA/IGxvY2FsZSA6IHRoaXMubG9jYWxlKS5mb3JtYXQoaW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtYXR0ZWRJbnRWYWx1ZSA9IFN0cmluZyhpbnRWYWx1ZSkudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCB0aG91c2FuZFNlcGFyYXRvcik7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWRJbnRWYWx1ZTtcbiAgfVxuXG4gIGdldFJlYWxWYWx1ZSh2YWx1ZTogYW55LCBhcmdzOiBJUmVhbFBpcGVBcmd1bWVudCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxlID0gYXJncyA/IGFyZ3MubG9jYWxlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRob3VzYW5kU2VwYXJhdG9yID0gYXJncyA/IGFyZ3MudGhvdXNhbmRTZXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9IGFyZ3MgPyBhcmdzLmRlY2ltYWxTZXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ3JvdXBpbmcgPSBhcmdzID8gYXJncy5ncm91cGluZyA6IGZhbHNlO1xuXG4gICAgY29uc3QgbWluRGVjaW1hbERpZ2l0cyA9IGFyZ3MgPyBhcmdzLm1pbkRlY2ltYWxEaWdpdHMgOiB0aGlzLm1pbkRlY2ltYWxEaWdpdHM7XG4gICAgY29uc3QgbWF4RGVjaW1hbERpZ2l0cyA9IGFyZ3MgPyBhcmdzLm1heERlY2ltYWxEaWdpdHMgOiB0aGlzLm1heERlY2ltYWxEaWdpdHM7XG5cbiAgICBsZXQgZm9ybWF0dGVkUmVhbFZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgdXNlSW50bE51bWJlckZvcm1hdDogYm9vbGVhbiA9IFV0aWwuaXNEZWZpbmVkKGxvY2FsZSkgfHwgKCFVdGlsLmlzRGVmaW5lZCh0aG91c2FuZFNlcGFyYXRvcikgfHwgIVV0aWwuaXNEZWZpbmVkKGRlY2ltYWxTZXBhcmF0b3IpKTtcbiAgICBpZiAodXNlSW50bE51bWJlckZvcm1hdCkge1xuICAgICAgZm9ybWF0dGVkUmVhbFZhbHVlID0gYXJncy50cnVuY2F0ZSA/IHRoaXMudHJ1bmNhdGUodmFsdWUsIG1heERlY2ltYWxEaWdpdHMpIDogbnVsbDtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQoZm9ybWF0dGVkUmVhbFZhbHVlKSkge1xuICAgICAgICBsZXQgZm9ybWF0dGVyQXJnczogYW55ID0ge1xuICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluRGVjaW1hbERpZ2l0cyxcbiAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG1heERlY2ltYWxEaWdpdHMsXG4gICAgICAgICAgdXNlR3JvdXBpbmc6IGdyb3VwaW5nXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1hdHRlZFJlYWxWYWx1ZSA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChVdGlsLmlzRGVmaW5lZChsb2NhbGUpID8gbG9jYWxlIDogdGhpcy5sb2NhbGUsIGZvcm1hdHRlckFyZ3MpLmZvcm1hdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdHRlZFJlYWxWYWx1ZSA9IHRoaXMucGFyc2VSZWFsVmFsdWUodmFsdWUsIG1heERlY2ltYWxEaWdpdHMsIHRob3VzYW5kU2VwYXJhdG9yLCBkZWNpbWFsU2VwYXJhdG9yLCBncm91cGluZyk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWRSZWFsVmFsdWU7XG4gIH1cblxuICBnZXRQZXJjZW50VmFsdWUodmFsdWU6IGFueSwgYXJnczogYW55KSB7XG4gICAgY29uc3QgdmFsdWVCYXNlID0gYXJncyA/IGFyZ3MudmFsdWVCYXNlIDogdW5kZWZpbmVkO1xuICAgIGxldCBwYXJzZWRWYWx1ZSA9IHZhbHVlO1xuICAgIHN3aXRjaCAodmFsdWVCYXNlKSB7XG4gICAgICBjYXNlIDEwMDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlICogMTAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgZm9ybWF0dGVkUGVyY2VudFZhbHVlID0gdGhpcy5nZXRSZWFsVmFsdWUocGFyc2VkVmFsdWUsIGFyZ3MpICsgJyAlJztcbiAgICByZXR1cm4gZm9ybWF0dGVkUGVyY2VudFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnVuY2F0ZSh2YWx1ZTogbnVtYmVyLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgY29uc3Qgc3BsaXR0ZWRWYWx1ZSA9IHN0cmluZ1ZhbHVlLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZGVjaW1hbHNMZW5ndGggPSBVdGlsLmlzRGVmaW5lZChzcGxpdHRlZFZhbHVlWzFdKSA/IHNwbGl0dGVkVmFsdWVbMV0ubGVuZ3RoIDogbnVsbDtcbiAgICBpZiAoZGVjaW1hbHNMZW5ndGggPiBtYXhEZWNpbWFscykge1xuICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlLnNsaWNlKDAsIHNwbGl0dGVkVmFsdWVbMF0ubGVuZ3RoICsgMSArIG1heERlY2ltYWxzKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUmVhbFZhbHVlKHZhbHVlOiBhbnksIG1heERlY2ltYWxEaWdpdHM6IG51bWJlciwgdGhvdXNhbmRTZXBhcmF0b3I6IHN0cmluZywgZGVjaW1hbFNlcGFyYXRvcjogc3RyaW5nLCBncm91cGluZzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlO1xuICAgIGNvbnN0IHJlYWxWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZWFsVmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSBTdHJpbmcocmVhbFZhbHVlKTtcbiAgICAgIGxldCB0bXBTdHIgPSByZWFsVmFsdWUudG9GaXhlZChtYXhEZWNpbWFsRGlnaXRzKTtcbiAgICAgIHRtcFN0ciA9IHRtcFN0ci5yZXBsYWNlKCcuJywgZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICBpZiAoZ3JvdXBpbmcpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB0bXBTdHIuc3BsaXQoZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcGFydHNbMF0gPSBwYXJ0c1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCB0aG91c2FuZFNlcGFyYXRvcik7XG4gICAgICAgICAgcmVzdWx0ID0gcGFydHMuam9pbihkZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdG1wU3RyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=