UNPKG

chayns-components

Version:

A set of beautiful React components for developing chayns® applications.

100 lines (98 loc) 2.96 kB
import Formatter from './Formatter'; import IntegerFormatter from './IntegerFormatter'; export default class DecimalFormatter extends Formatter { constructor(_temp) { let { decimalSeparator = ',', thousandSeparator = '.', decimals = null } = _temp === void 0 ? {} : _temp; super(); this.config = { seperators: { thousand: false, decimal: '.' }, decimals: null }; this.config.seperators.thousand = thousandSeparator; this.config.seperators.decimal = decimalSeparator; this.config.decimals = decimals; } format(value) { const { decimals } = this.config; const { thousand: thousandSeparator, decimal: decimalSeparator } = this.config.seperators; if (value === null) { return ''; } const valueParts = String(value).split('.'); valueParts[0] = valueParts[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousandSeparator); if (decimals) { if (valueParts[1] && valueParts[1].length > decimals) { valueParts[1] = valueParts[1].slice(0, decimals); } else if (!valueParts[1] || valueParts[1].length < decimals) { const length = valueParts[1] ? valueParts[1].length : 0; let padding = ''; for (let i = length; i < decimals; i += 1) { padding += '0'; } valueParts[1] = (valueParts[1] || '') + padding; } } return valueParts.join(decimalSeparator); } parse(value) { const { thousand: thousandSeparator, decimal: decimalSeparator } = this.config.seperators; if (value === '') { return null; } const parsedValue = parseFloat(value.split(thousandSeparator).join('').replace(decimalSeparator, '.')); /* eslint-disable-next-line no-restricted-globals */ return isNaN(parsedValue) || !isFinite(parsedValue) ? false : parsedValue; } validateChars(value) { const { thousand: thousandSeparator, decimal: decimalSeparator } = this.config.seperators; for (let i = 0; i < value.length; i += 1) { if (IntegerFormatter.ALLOWED_CHARS.indexOf(value[i]) === -1 && value[i] !== thousandSeparator && value[i] !== decimalSeparator) { if (i === 0 && value[i] === '-') { return true; } return false; } } return true; } validate(value, selection) { const { decimals } = this.config; const { decimal: decimalSeparator } = this.config.seperators; const valueParts = value.split(decimalSeparator); if (valueParts.length > 2 || decimals !== null && valueParts[1] && valueParts[1].length > decimals || !this.validateChars(value)) { return { valid: false, selection: { start: Math.max(0, selection.start - 1), end: Math.min(value.length, selection.end) } }; } return { valid: true }; } } //# sourceMappingURL=DecimalFormatter.js.map