ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
115 lines • 18.2 kB
JavaScript
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=