UNPKG

react-currency-format

Version:

React component to format currency in an input or as a text.

118 lines (102 loc) 3.44 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.noop = noop; exports.returnTrue = returnTrue; exports.charIsNumber = charIsNumber; exports.escapeRegExp = escapeRegExp; exports.fixLeadingZero = fixLeadingZero; exports.splitString = splitString; exports.limitToScale = limitToScale; exports.roundToPrecision = roundToPrecision; exports.omit = omit; exports.setCaretPosition = setCaretPosition; // basic noop function function noop() {} function returnTrue() { return true; } function charIsNumber(char) { return !!(char || '').match(/\d/); } function escapeRegExp(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); } function fixLeadingZero(numStr) { if (!numStr) return numStr; var isNegative = numStr[0] === '-'; if (isNegative) numStr = numStr.substring(1, numStr.length); var parts = numStr.split('.'); var beforeDecimal = parts[0].replace(/^0+/, '') || '0'; var afterDecimal = parts[1] || ''; return '' + (isNegative ? '-' : '') + beforeDecimal + (afterDecimal ? '.' + afterDecimal : ''); } function splitString(str, index) { return [str.substring(0, index), str.substring(index)]; } /** * limit decimal numbers to given scale * Not used .fixedTo because that will break with big numbers */ function limitToScale(numStr, scale, fixedDecimalScale) { var str = ''; var filler = fixedDecimalScale ? '0' : ''; for (var i = 0; i <= scale - 1; i++) { str += numStr[i] || filler; } return str; } /** * This method is required to round prop value to given scale. * Not used .round or .fixedTo because that will break with big numbers */ function roundToPrecision(numStr, scale, fixedDecimalScale) { var numberParts = numStr.split('.'); var roundedDecimalParts = parseFloat('0.' + (numberParts[1] || '0')).toFixed(scale).split('.'); var intPart = numberParts[0].split('').reverse().reduce(function (roundedStr, current, idx) { if (roundedStr.length > idx) { return (Number(roundedStr[0]) + Number(current)).toString() + roundedStr.substring(1, roundedStr.length); } return current + roundedStr; }, roundedDecimalParts[0]); var decimalPart = limitToScale(roundedDecimalParts[1] || '', (numberParts[1] || '').length, fixedDecimalScale); return intPart + (decimalPart ? '.' + decimalPart : ''); } function omit(obj, keyMaps) { var filteredObj = {}; Object.keys(obj).forEach(function (key) { if (!keyMaps[key]) filteredObj[key] = obj[key]; }); return filteredObj; } /** set the caret positon in an input field **/ function setCaretPosition(el, caretPos) { el.value = el.value; // ^ this is used to not only get "focus", but // to make sure we don't have it everything -selected- // (it causes an issue in chrome, and having it doesn't hurt any other browser) if (el !== null) { if (el.createTextRange) { var range = el.createTextRange(); range.move('character', caretPos); range.select(); return true; } // (el.selectionStart === 0 added for Firefox bug) if (el.selectionStart || el.selectionStart === 0) { el.focus(); el.setSelectionRange(caretPos, caretPos); return true; } // fail city, fortunately this never happens (as far as I've tested) :) el.focus(); return false; } } var thousandGroupSpacing = exports.thousandGroupSpacing = { two: '2', twoScaled: '2s', three: '3', four: '4' };