com.phloxui
Version:
PhloxUI Ng2+ Framework
235 lines (234 loc) • 18.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { AbstractPipeFormatter } from './AbstractPipeFormatter';
import { Option } from '../decorator/Option.decorator';
var /** @type {?} */ NAME = 'number';
var /** @type {?} */ CEIL = 'ceil';
var /** @type {?} */ ROUND = 'round';
var /** @type {?} */ FLOOR = 'floor';
var NumberFormatter = /** @class */ (function (_super) {
tslib_1.__extends(NumberFormatter, _super);
function NumberFormatter() {
var _this = _super.call(this, NAME) || this;
_this.setDefaultValues();
return _this;
}
/**
* @return {?}
*/
NumberFormatter.prototype.setDefaultValues = /**
* @return {?}
*/
function () {
if (this.roundingMode === null || typeof this.roundingMode === 'undefined') {
this.roundingMode = ROUND;
}
};
/**
* @param {?} num
* @return {?}
*/
NumberFormatter.prototype.decimalCount = /**
* @param {?} num
* @return {?}
*/
function (num) {
var /** @type {?} */ match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
if (!match) {
return 0;
}
return Math.max(0,
// Number of digits right of decimal point.
(match[1] ? match[1].length : 0)
// Adjust for scientific notation.
- (match[2] ? +match[2] : 0));
};
/**
* @param {?} options
* @return {?}
*/
NumberFormatter.prototype.setOptions = /**
* @param {?} options
* @return {?}
*/
function (options) {
_super.prototype.setOptions.call(this, options);
// Set default values of setting options
this.setDefaultValues();
};
/**
* @param {?} data
* @return {?}
*/
NumberFormatter.prototype.format = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (data === null || typeof data !== 'number') {
return "";
}
var /** @type {?} */ formattedData = data.toString();
var /** @type {?} */ factor = null;
if (this.maxFraction !== null && this.maxFraction !== undefined) {
factor = Math.pow(10, this.maxFraction);
}
else if (this.minFraction !== null && this.minFraction !== undefined) {
factor = Math.pow(10, this.minFraction);
}
if (factor !== null) {
if (this.roundingMode === CEIL) {
formattedData = (Math.ceil(data * factor) / factor).toString();
}
else if (this.roundingMode === FLOOR) {
formattedData = (Math.floor(data * factor) / factor).toString();
}
else {
// default as round
formattedData = (Math.round(data * factor) / factor).toString();
}
}
if (this.minFraction !== null && this.minFraction !== undefined) {
var /** @type {?} */ idx = formattedData.indexOf(".");
if (idx > -1) {
var /** @type {?} */ decimal = formattedData.slice(idx + 1, formattedData.length);
if (decimal.length < this.minFraction) {
for (var /** @type {?} */ i = decimal.length; i < this.minFraction; i++) {
decimal += "0";
}
}
// add new fraction
formattedData = formattedData.slice(0, idx) + "." + decimal;
}
else {
var /** @type {?} */ decimal = "";
for (var /** @type {?} */ i = 0; i < this.minFraction; i++) {
decimal += "0";
}
formattedData = formattedData + "." + decimal;
}
}
return formattedData;
};
/**
* @param {?} data
* @return {?}
*/
NumberFormatter.prototype.parse = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (data === null || typeof data === 'undefined') {
return null;
}
return 0;
};
/**
* @param {?} args
* @return {?}
*/
NumberFormatter.prototype.parseToOptions = /**
* @param {?} args
* @return {?}
*/
function (args) {
var /** @type {?} */ minFraction = undefined;
var /** @type {?} */ maxFraction = undefined;
var /** @type {?} */ roundingMode = undefined;
if (args !== null && typeof args !== 'undefined') {
if (args.length > 0) {
minFraction = args[0];
}
if (args.length > 1) {
maxFraction = args[1];
}
if (args.length > 2) {
roundingMode = args[2];
}
}
return {
minFraction: minFraction,
maxFraction: maxFraction,
roundingMode: roundingMode
};
};
/**
* @return {?}
*/
NumberFormatter.prototype.getMinFraction = /**
* @return {?}
*/
function () {
return this.minFraction;
};
/**
* @param {?} minFraction
* @return {?}
*/
NumberFormatter.prototype.setMinFraction = /**
* @param {?} minFraction
* @return {?}
*/
function (minFraction) {
this.minFraction = minFraction;
};
/**
* @return {?}
*/
NumberFormatter.prototype.getMaxFraction = /**
* @return {?}
*/
function () {
return this.maxFraction;
};
/**
* @param {?} maxFraction
* @return {?}
*/
NumberFormatter.prototype.setMaxFraction = /**
* @param {?} maxFraction
* @return {?}
*/
function (maxFraction) {
this.maxFraction = maxFraction;
};
NumberFormatter.NAME = NAME;
NumberFormatter.CEIL = CEIL;
NumberFormatter.ROUND = ROUND;
NumberFormatter.FLOOR = FLOOR;
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Number)
], NumberFormatter.prototype, "minFraction", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Number)
], NumberFormatter.prototype, "maxFraction", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], NumberFormatter.prototype, "roundingMode", void 0);
return NumberFormatter;
}(AbstractPipeFormatter));
export { NumberFormatter };
function NumberFormatter_tsickle_Closure_declarations() {
/** @type {?} */
NumberFormatter.NAME;
/** @type {?} */
NumberFormatter.CEIL;
/** @type {?} */
NumberFormatter.ROUND;
/** @type {?} */
NumberFormatter.FLOOR;
/** @type {?} */
NumberFormatter.prototype.minFraction;
/** @type {?} */
NumberFormatter.prototype.maxFraction;
/** @type {?} */
NumberFormatter.prototype.roundingMode;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnVtYmVyRm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvZm9ybWF0dGVyL051bWJlckZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUt2RCxxQkFBTSxJQUFJLEdBQVcsUUFBUSxDQUFDO0FBRTlCLHFCQUFNLElBQUksR0FBVyxNQUFNLENBQUM7QUFDNUIscUJBQU0sS0FBSyxHQUFXLE9BQU8sQ0FBQztBQUM5QixxQkFBTSxLQUFLLEdBQVcsT0FBTyxDQUFDOztJQUVPLDJDQUFxQjtJQWN4RDtRQUFBLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBR1o7UUFEQyxLQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7S0FDekI7Ozs7SUFFTywwQ0FBZ0I7Ozs7UUFDdEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7Ozs7OztJQUdLLHNDQUFZOzs7O2NBQUMsR0FBVztRQUM5QixxQkFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDakUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNWO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2IsQ0FBQzs7UUFFRCxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxD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R0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCO1lBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO1NBQ0Y7UUFFRCxNQUFNLENBQUM7WUFDTCxXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFDOzs7OztJQUdHLHdDQUFjOzs7O1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFBOzs7Ozs7SUFHbEIsd0NBQWM7Ozs7Y0FBQyxXQUFtQjtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQzs7Ozs7SUFHMUIsd0NBQWM7Ozs7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUE7Ozs7OztJQUdsQix3Q0FBYzs7OztjQUFDLFdBQW1CO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBOzsyQkE1SU0sSUFBSTsyQkFDSixJQUFJOzRCQUNILEtBQUs7NEJBQ0wsS0FBSzs7UUFFM0MsTUFBTSxFQUFFOzs7O1FBRVIsTUFBTSxFQUFFOzs7O1FBRVIsTUFBTSxFQUFFOzs7MEJBdkJYO0VBWXFDLHFCQUFxQjtTQUE3QyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RQaXBlRm9ybWF0dGVyIH0gZnJvbSAnLi9BYnN0cmFjdFBpcGVGb3JtYXR0ZXInO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRGF0ZVRpbWVVdGlscyB9IGZyb20gJy4uL3V0aWxzL0RhdGVUaW1lVXRpbHMnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvc2VydmljZXMnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vbW9kZWwvUGhsb3hBcHBJbmZvJztcblxuY29uc3QgTkFNRTogc3RyaW5nID0gJ251bWJlcic7XG5cbmNvbnN0IENFSUw6IHN0cmluZyA9ICdjZWlsJztcbmNvbnN0IFJPVU5EOiBzdHJpbmcgPSAncm91bmQnO1xuY29uc3QgRkxPT1I6IHN0cmluZyA9ICdmbG9vcic7XG5cbmV4cG9ydCBjbGFzcyBOdW1iZXJGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdFBpcGVGb3JtYXR0ZXIge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkFNRTogc3RyaW5nID0gTkFNRTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDRUlMOiBzdHJpbmcgPSBDRUlMO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJPVU5EOiBzdHJpbmcgPSBST1VORDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGTE9PUjogc3RyaW5nID0gRkxPT1I7XG5cbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbWluRnJhY3Rpb246IG51bWJlcjtcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbWF4RnJhY3Rpb246IG51bWJlcjtcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgcm91bmRpbmdNb2RlOiBzdHJpbmc7IC8vIHJvdW5kIGZsb29yIGNlaWxpbmcgZGVmYXVsdCBhcyBhIGNlaWxpbmdcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihOQU1FKTtcblxuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREZWZhdWx0VmFsdWVzKCkge1xuICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5yb3VuZGluZ01vZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJvdW5kaW5nTW9kZSA9IFJPVU5EO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjaW1hbENvdW50KG51bTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgbWF0Y2ggPSAoJycgKyBudW0pLm1hdGNoKC8oPzpcXC4oXFxkKykpPyg/OltlRV0oWystXT9cXGQrKSk/JC8pO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIDAsXG4gICAgICAvLyBOdW1iZXIgb2YgZGlnaXRzIHJpZ2h0IG9mIGRlY2ltYWwgcG9pbnQuXG4gICAgICAobWF0Y2hbMV0gPyBtYXRjaFsxXS5sZW5ndGggOiAwKVxuICAgICAgLy8gQWRqdXN0IGZvciBzY2llbnRpZmljIG5vdGF0aW9uLlxuICAgICAgLSAobWF0Y2hbMl0gPyArbWF0Y2hbMl0gOiAwKSk7XG4gIH1cblxuICAvLyBPdmVycmlkZVxuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICBzdXBlci5zZXRPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIG9mIHNldHRpbmcgb3B0aW9uc1xuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlcygpO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdChkYXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChkYXRhID09PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdHRlZERhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgbGV0IGZhY3RvciA9IG51bGw7XG4gICAgaWYgKHRoaXMubWF4RnJhY3Rpb24gIT09IG51bGwgJiYgdGhpcy5tYXhGcmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgdGhpcy5tYXhGcmFjdGlvbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1pbkZyYWN0aW9uICE9PSBudWxsICYmIHRoaXMubWluRnJhY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFjdG9yID0gTWF0aC5wb3coMTAsIHRoaXMubWluRnJhY3Rpb24pO1xuICAgIH1cblxuICAgIGlmIChmYWN0b3IgIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gQ0VJTCkge1xuICAgICAgICBmb3JtYXR0ZWREYXRhID0gKE1hdGguY2VpbChkYXRhICogZmFjdG9yKSAvIGZhY3RvcikudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IEZMT09SKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSAoTWF0aC5mbG9vcihkYXRhICogZmFjdG9yKSAvIGZhY3RvcikudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlZmF1bHQgYXMgcm91bmRcbiAgICAgICAgZm9ybWF0dGVkRGF0YSA9IChNYXRoLnJvdW5kKGRhdGEgKiBmYWN0b3IpIC8gZmFjdG9yKS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbkZyYWN0aW9uICE9PSBudWxsICYmIHRoaXMubWluRnJhY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGlkeCA9IGZvcm1hdHRlZERhdGEuaW5kZXhPZihcIi5cIik7XG4gICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgbGV0IGRlY2ltYWwgPSBmb3JtYXR0ZWREYXRhLnNsaWNlKGlkeCArIDEsIGZvcm1hdHRlZERhdGEubGVuZ3RoKTtcblxuICAgICAgICBpZiAoZGVjaW1hbC5sZW5ndGggPCB0aGlzLm1pbkZyYWN0aW9uKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGRlY2ltYWwubGVuZ3RoOyBpIDwgdGhpcy5taW5GcmFjdGlvbjsgaSsrKSB7XG4gICAgICAgICAgICBkZWNpbWFsICs9IFwiMFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBuZXcgZnJhY3Rpb25cbiAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGZvcm1hdHRlZERhdGEuc2xpY2UoMCwgaWR4KSArIFwiLlwiICsgZGVjaW1hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBkZWNpbWFsID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1pbkZyYWN0aW9uOyBpKyspIHtcbiAgICAgICAgICBkZWNpbWFsICs9IFwiMFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGZvcm1hdHRlZERhdGEgKyBcIi5cIiArIGRlY2ltYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZERhdGE7XG4gIH1cblxuICBwdWJsaWMgcGFyc2UoZGF0YTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZVRvT3B0aW9ucyhhcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgbGV0IG1pbkZyYWN0aW9uOiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG1heEZyYWN0aW9uOiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJvdW5kaW5nTW9kZTogc3RyaW5nID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFyZ3MgIT09IG51bGwgJiYgdHlwZW9mIGFyZ3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1pbkZyYWN0aW9uID0gYXJnc1swXTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbWF4RnJhY3Rpb24gPSBhcmdzWzFdO1xuICAgICAgfVxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgICByb3VuZGluZ01vZGUgPSBhcmdzWzJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtaW5GcmFjdGlvbjogbWluRnJhY3Rpb24sXG4gICAgICBtYXhGcmFjdGlvbjogbWF4RnJhY3Rpb24sXG4gICAgICByb3VuZGluZ01vZGU6IHJvdW5kaW5nTW9kZVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0TWluRnJhY3Rpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5taW5GcmFjdGlvblxuICB9XG5cbiAgcHVibGljIHNldE1pbkZyYWN0aW9uKG1pbkZyYWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1pbkZyYWN0aW9uID0gbWluRnJhY3Rpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4RnJhY3Rpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXhGcmFjdGlvblxuICB9XG5cbiAgcHVibGljIHNldE1heEZyYWN0aW9uKG1heEZyYWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heEZyYWN0aW9uID0gbWF4RnJhY3Rpb25cbiAgfVxufVxuIl19