UNPKG

@syncfusion/ej2-base

Version:

A common package of Essential JS 2 base libraries, methods and class definitions

135 lines (134 loc) 5.97 kB
import { extend, isNullOrUndefined, isBlazor, getValue } from '../util'; import { ParserBase as parser } from './parser-base'; import { IntlBase as base } from './intl-base'; var regExp = RegExp; var parseRegex = new regExp('^([^0-9]*)' + '(([0-9,]*[0-9]+)(.[0-9]+)?)' + '([Ee][+-]?[0-9]+)?([^0-9]*)$'); var groupRegex = /,/g; var keys = ['minusSign', 'infinity']; /** * Module for Number Parser. * * @private */ var NumberParser = /** @class */ (function () { function NumberParser() { } /** * Returns the parser function for given skeleton. * * @param {string} culture - Specifies the culture name to be which formatting. * @param {NumberFormatOptions} option - Specific the format in which number will parsed. * @param {Object} cldr - Specifies the global cldr data collection. * @returns {Function} ? */ NumberParser.numberParser = function (culture, option, cldr) { var _this = this; var dependable = base.getDependables(cldr, culture, '', true); var parseOptions = { custom: true }; if ((base.formatRegex.test(option.format)) || !(option.format)) { extend(parseOptions, base.getProperNumericSkeleton(option.format || 'N')); parseOptions.custom = false; if (!parseOptions.fractionDigits) { if (option.maximumFractionDigits) { parseOptions.maximumFractionDigits = option.maximumFractionDigits; } } } else { extend(parseOptions, base.customFormat(option.format, null, null)); } var numbers = getValue('numbers', dependable.parserObject); var numOptions = parser.getCurrentNumericOptions(dependable.parserObject, parser.getNumberingSystem(cldr), true, isBlazor()); parseOptions.symbolRegex = parser.getSymbolRegex(Object.keys(numOptions.symbolMatch)); parseOptions.infinity = numOptions.symbolNumberSystem[keys[1]]; var symbolpattern; if (!isBlazor()) { symbolpattern = base.getSymbolPattern(parseOptions.type, numOptions.numberSystem, dependable.numericObject, parseOptions.isAccount); if (symbolpattern) { symbolpattern = symbolpattern.replace(/\u00A4/g, base.defaultCurrency); var split = symbolpattern.split(';'); parseOptions.nData = base.getFormatData(split[1] || '-' + split[0], true, ''); parseOptions.pData = base.getFormatData(split[0], true, ''); } } else { parseOptions.nData = extend({}, {}, getValue(parseOptions.type + 'nData', numbers)); parseOptions.pData = extend({}, {}, getValue(parseOptions.type + 'pData', numbers)); if (parseOptions.type === 'currency' && option.currency) { base.replaceBlazorCurrency([parseOptions.pData, parseOptions.nData], getValue('currencySymbol', numbers), option.currency); } } return function (value) { return _this.getParsedNumber(value, parseOptions, numOptions); }; }; /** * Returns parsed number for the provided formatting options * * @param {string} value ? * @param {NumericParts} options ? * @param {NumericOptions} numOptions ? * @returns {number} ? */ NumberParser.getParsedNumber = function (value, options, numOptions) { var isNegative; var isPercent; var tempValue; var lead; var end; var ret; if (value.indexOf(options.infinity) !== -1) { return Infinity; } else { value = parser.convertValueParts(value, options.symbolRegex, numOptions.symbolMatch); value = parser.convertValueParts(value, numOptions.numberParseRegex, numOptions.numericPair); value = value.indexOf('-') !== -1 ? value.replace('-.', '-0.') : value; if (value.indexOf('.') === 0) { value = '0' + value; } var matches = value.match(parseRegex); if (isNullOrUndefined(matches)) { return NaN; } lead = matches[1]; tempValue = matches[2]; var exponent = matches[5]; end = matches[6]; isNegative = options.custom ? ((lead === options.nData.nlead) && (end === options.nData.nend)) : ((lead.indexOf(options.nData.nlead) !== -1) && (end.indexOf(options.nData.nend) !== -1)); isPercent = isNegative ? options.nData.isPercent : options.pData.isPercent; tempValue = tempValue.replace(groupRegex, ''); if (exponent) { tempValue += exponent; } ret = +tempValue; if (options.type === 'percent' || isPercent) { ret = ret / 100; } if (options.custom || options.fractionDigits) { ret = parseFloat(ret.toFixed(options.custom ? (isNegative ? options.nData.maximumFractionDigits : options.pData.maximumFractionDigits) : options.fractionDigits)); } if (options.maximumFractionDigits) { ret = this.convertMaxFracDigits(tempValue, options, ret, isNegative); } if (isNegative) { ret *= -1; } return ret; } }; NumberParser.convertMaxFracDigits = function (value, options, ret, isNegative) { var decimalSplitValue = value.split('.'); if (decimalSplitValue[1] && decimalSplitValue[1].length > options.maximumFractionDigits) { ret = +(ret.toFixed(options.custom ? (isNegative ? options.nData.maximumFractionDigits : options.pData.maximumFractionDigits) : options.maximumFractionDigits)); } return ret; }; return NumberParser; }()); export { NumberParser };