UNPKG

@telerik/kendo-intl

Version:

A package exporting functions for date and number parsing and formatting

143 lines (112 loc) 4.16 kB
import { localeInfo, localeCurrency, currencyDisplays } from '../cldr'; import { PERCENT, NUMBER_PLACEHOLDER, CURRENCY_PLACEHOLDER, DEFAULT_LOCALE, EMPTY, POINT } from '../common/constants'; import { setStyleOptions, setFormatLiterals } from './utils'; import isNumber from '../common/is-number'; import isCurrencyStyle from './is-currency-style'; import formatOptions from './format-options'; import isString from '../common/is-string'; var exponentRegExp = /[eE][\-+]?[0-9]+/; var nonBreakingSpaceRegExp = /\u00A0/g; function cleanNegativePattern(number, patterns) { if (patterns.length > 1) { var parts = (patterns[1] || EMPTY).replace(CURRENCY_PLACEHOLDER, EMPTY).split(NUMBER_PLACEHOLDER); if (number.indexOf(parts[0]) > -1 && number.indexOf(parts[1]) > -1) { return number.replace(parts[0], EMPTY).replace(parts[1], EMPTY); } } } function cleanCurrencyNumber(value, info, format) { var options = formatOptions(format) || {}; var isCurrency = isCurrencyStyle(options.style); var number = value; var negative; var currency = options.currency || localeCurrency(info, isCurrency); if (currency) { var displays = currencyDisplays(info, currency, isCurrency); if (displays) { for (var idx = 0; idx < displays.length; idx++) { var display = displays[idx]; if (number.includes(display)) { number = number.replace(display, EMPTY); isCurrency = true; break; } } } if (isCurrency) { var cleanNumber = cleanNegativePattern(number, info.numbers.currency.patterns) || cleanNegativePattern(number, info.numbers.accounting.patterns); if (cleanNumber) { negative = true; number = cleanNumber; } } } return { number: number, negative: negative }; } function cleanLiterals(number, formatOptions) { var literals = formatOptions.literals; var result = number; if (literals) { for (var idx = 0; idx < literals.length; idx++) { result = result.replace(literals[idx], EMPTY); } } return result; } export default function parseNumber(value, locale, format) { if ( locale === void 0 ) locale = DEFAULT_LOCALE; if ( format === void 0 ) format = {}; if (!value && value !== 0) { return null; } if (isNumber(value)) { return value; } var info = localeInfo(locale); var symbols = info.numbers.symbols; var number = value.toString(); var formatOptions = format || {}; var isPercent; if (isString(format)) { formatOptions = { format: format }; setFormatLiterals(formatOptions); number = cleanLiterals(number, formatOptions); setStyleOptions(formatOptions, info); } if (formatOptions.style === PERCENT || number.indexOf(symbols.percentSign) > -1) { number = number.replace(symbols.percentSign, EMPTY); isPercent = true; } if (exponentRegExp.test(number)) { number = parseFloat(number.replace(symbols.decimal, POINT)); return isNaN(number) ? null : number; } var ref = cleanCurrencyNumber(number, info, formatOptions); var negativeCurrency = ref.negative; var currencyNumber = ref.number; number = String(currencyNumber).trim(); var negativeSignIndex = number.indexOf("-"); if (negativeSignIndex > 0) { return null; } var isNegative = negativeSignIndex > -1; isNegative = negativeCurrency !== undefined ? negativeCurrency : isNegative; number = number.replace("-", EMPTY) .replace(nonBreakingSpaceRegExp, " ") .split(symbols.group.replace(nonBreakingSpaceRegExp, " ")).join(EMPTY) .replace(symbols.decimal, POINT); number = parseFloat(number); if (isNaN(number)) { number = null; } else if (isNegative) { number *= -1; } if (number && isPercent) { number /= 100; } return number; }