ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
115 lines • 18 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 = parseInt(value, 10);
if (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 = parseFloat(value);
if (!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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QyxDQUFDO2lCQUN2QzthQUNGO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxNQUFNLENBQUM7YUFDakI7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBckhhLG9DQUFzQixHQUFHLENBQUMsQ0FBQzsyR0FGOUIsYUFBYTsrR0FBYixhQUFhLGNBRlosTUFBTTs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IElSZWFsUGlwZUFyZ3VtZW50IH0gZnJvbSAnLi4vcGlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4vdHJhbnNsYXRlL28tdHJhbnNsYXRlLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJTZXJ2aWNlIHtcblxuICBwdWJsaWMgc3RhdGljIERFRkFVTFRfREVDSU1BTF9ESUdJVFMgPSAyO1xuXG4gIHByb3RlY3RlZCBtaW5EZWNpbWFsRGlnaXRzOiBudW1iZXI7XG4gIHByb3RlY3RlZCBtYXhEZWNpbWFsRGlnaXRzOiBudW1iZXI7XG4gIHByb3RlY3RlZCBsb2NhbGU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogT1RyYW5zbGF0ZVNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQoT1RyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIC8vIFRPRE86IGluaXRpYWxpemUgZnJvbSBjb25maWdcbiAgICB0aGlzLm1pbkRlY2ltYWxEaWdpdHMgPSBOdW1iZXJTZXJ2aWNlLkRFRkFVTFRfREVDSU1BTF9ESUdJVFM7XG4gICAgdGhpcy5tYXhEZWNpbWFsRGlnaXRzID0gTnVtYmVyU2VydmljZS5ERUZBVUxUX0RFQ0lNQUxfRElHSVRTO1xuXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0Q3VycmVudExhbmcoKVxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5vbkxhbmd1YWdlQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT5cbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEN1cnJlbnRMYW5nKClcbiAgICApO1xuICB9XG5cbiAgZ2V0SW50ZWdlclZhbHVlKHZhbHVlOiBhbnksIGFyZ3M6IGFueSkge1xuICAgIGNvbnN0IGdyb3VwaW5nID0gYXJncyA/IGFyZ3MuZ3JvdXBpbmcgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgdGhvdXNhbmRTZXBhcmF0b3IgPSBhcmdzID8gYXJncy50aG91c2FuZFNlcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsb2NhbGUgPSBhcmdzID8gYXJncy5sb2NhbGUgOiB1bmRlZmluZWQ7XG4gICAgLy8gRW5zdXJlIHZhbHVlIGlzIGFuIGludGVnZXJcbiAgICBjb25zdCBpbnRWYWx1ZTogYW55ID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICBpZiAoaXNOYU4oaW50VmFsdWUpKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICAvLyBGb3JtYXQgdmFsdWVcbiAgICBsZXQgZm9ybWF0dGVkSW50VmFsdWU7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGxvY2FsZSkgfHwgIVV0aWwuaXNEZWZpbmVkKHRob3VzYW5kU2VwYXJhdG9yKSkge1xuICAgICAgZm9ybWF0dGVkSW50VmFsdWUgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQoVXRpbC5pc0RlZmluZWQobG9jYWxlKSA/IGxvY2FsZSA6IHRoaXMubG9jYWxlKS5mb3JtYXQoaW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtYXR0ZWRJbnRWYWx1ZSA9IFN0cmluZyhpbnRWYWx1ZSkudG9TdHJpbmcoKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCB0aG91c2FuZFNlcGFyYXRvcik7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWRJbnRWYWx1ZTtcbiAgfVxuXG4gIGdldFJlYWxWYWx1ZSh2YWx1ZTogYW55LCBhcmdzOiBJUmVhbFBpcGVBcmd1bWVudCkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxlID0gYXJncyA/IGFyZ3MubG9jYWxlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRob3VzYW5kU2VwYXJhdG9yID0gYXJncyA/IGFyZ3MudGhvdXNhbmRTZXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9IGFyZ3MgPyBhcmdzLmRlY2ltYWxTZXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ3JvdXBpbmcgPSBhcmdzID8gYXJncy5ncm91cGluZyA6IGZhbHNlO1xuXG4gICAgY29uc3QgbWluRGVjaW1hbERpZ2l0cyA9IGFyZ3MgPyBhcmdzLm1pbkRlY2ltYWxEaWdpdHMgOiB0aGlzLm1pbkRlY2ltYWxEaWdpdHM7XG4gICAgY29uc3QgbWF4RGVjaW1hbERpZ2l0cyA9IGFyZ3MgPyBhcmdzLm1heERlY2ltYWxEaWdpdHMgOiB0aGlzLm1heERlY2ltYWxEaWdpdHM7XG5cbiAgICBsZXQgZm9ybWF0dGVkUmVhbFZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgdXNlSW50bE51bWJlckZvcm1hdDogYm9vbGVhbiA9IFV0aWwuaXNEZWZpbmVkKGxvY2FsZSkgfHwgKCFVdGlsLmlzRGVmaW5lZCh0aG91c2FuZFNlcGFyYXRvcikgfHwgIVV0aWwuaXNEZWZpbmVkKGRlY2ltYWxTZXBhcmF0b3IpKTtcbiAgICBpZiAodXNlSW50bE51bWJlckZvcm1hdCkge1xuICAgICAgZm9ybWF0dGVkUmVhbFZhbHVlID0gYXJncy50cnVuY2F0ZSA/IHRoaXMudHJ1bmNhdGUodmFsdWUsIG1heERlY2ltYWxEaWdpdHMpIDogbnVsbDtcbiAgICAgIGlmICghVXRpbC5pc0RlZmluZWQoZm9ybWF0dGVkUmVhbFZhbHVlKSkge1xuICAgICAgICBsZXQgZm9ybWF0dGVyQXJnczogYW55ID0ge1xuICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluRGVjaW1hbERpZ2l0cyxcbiAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG1heERlY2ltYWxEaWdpdHMsXG4gICAgICAgICAgdXNlR3JvdXBpbmc6IGdyb3VwaW5nXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1hdHRlZFJlYWxWYWx1ZSA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChVdGlsLmlzRGVmaW5lZChsb2NhbGUpID8gbG9jYWxlIDogdGhpcy5sb2NhbGUsIGZvcm1hdHRlckFyZ3MpLmZvcm1hdCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcm1hdHRlZFJlYWxWYWx1ZSA9IHRoaXMucGFyc2VSZWFsVmFsdWUodmFsdWUsIG1heERlY2ltYWxEaWdpdHMsIHRob3VzYW5kU2VwYXJhdG9yLCBkZWNpbWFsU2VwYXJhdG9yLCBncm91cGluZyk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZWRSZWFsVmFsdWU7XG4gIH1cblxuICBnZXRQZXJjZW50VmFsdWUodmFsdWU6IGFueSwgYXJnczogYW55KSB7XG4gICAgY29uc3QgdmFsdWVCYXNlID0gYXJncyA/IGFyZ3MudmFsdWVCYXNlIDogdW5kZWZpbmVkO1xuICAgIGxldCBwYXJzZWRWYWx1ZSA9IHZhbHVlO1xuICAgIHN3aXRjaCAodmFsdWVCYXNlKSB7XG4gICAgICBjYXNlIDEwMDpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlICogMTAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgZm9ybWF0dGVkUGVyY2VudFZhbHVlID0gdGhpcy5nZXRSZWFsVmFsdWUocGFyc2VkVmFsdWUsIGFyZ3MpICsgJyAlJztcbiAgICByZXR1cm4gZm9ybWF0dGVkUGVyY2VudFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB0cnVuY2F0ZSh2YWx1ZTogbnVtYmVyLCBtYXhEZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgY29uc3Qgc3BsaXR0ZWRWYWx1ZSA9IHN0cmluZ1ZhbHVlLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZGVjaW1hbHNMZW5ndGggPSBVdGlsLmlzRGVmaW5lZChzcGxpdHRlZFZhbHVlWzFdKSA/IHNwbGl0dGVkVmFsdWVbMV0ubGVuZ3RoIDogbnVsbDtcbiAgICBpZiAoZGVjaW1hbHNMZW5ndGggPiBtYXhEZWNpbWFscykge1xuICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlLnNsaWNlKDAsIHNwbGl0dGVkVmFsdWVbMF0ubGVuZ3RoICsgMSArIG1heERlY2ltYWxzKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUmVhbFZhbHVlKHZhbHVlOiBhbnksIG1heERlY2ltYWxEaWdpdHM6IG51bWJlciwgdGhvdXNhbmRTZXBhcmF0b3I6IHN0cmluZywgZGVjaW1hbFNlcGFyYXRvcjogc3RyaW5nLCBncm91cGluZzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlO1xuICAgIGNvbnN0IHJlYWxWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmICghaXNOYU4ocmVhbFZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gU3RyaW5nKHJlYWxWYWx1ZSk7XG4gICAgICBsZXQgdG1wU3RyID0gcmVhbFZhbHVlLnRvRml4ZWQobWF4RGVjaW1hbERpZ2l0cyk7XG4gICAgICB0bXBTdHIgPSB0bXBTdHIucmVwbGFjZSgnLicsIGRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgaWYgKGdyb3VwaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdG1wU3RyLnNwbGl0KGRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBhcnRzWzBdID0gcGFydHNbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgdGhvdXNhbmRTZXBhcmF0b3IpO1xuICAgICAgICAgIHJlc3VsdCA9IHBhcnRzLmpvaW4oZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRtcFN0cjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19