vue-currency-input
Advanced tools
Comparing version 1.12.1 to 1.13.0
/** | ||
* Vue Currency Input 1.12.1 | ||
* Vue Currency Input 1.13.0 | ||
* (c) 2019 Matthias Stiller | ||
@@ -11,7 +11,8 @@ * @license MIT | ||
var ns = numberFormat.format(-1); | ||
var decimalLength = (ps.match(/0/g) || []).length; | ||
var decimalSymbol = decimalLength > 0 ? ps.substr(ps.indexOf('6') + 1, 1) : null; | ||
var minimumFractionDigits = numberFormat.resolvedOptions().minimumFractionDigits || 0; | ||
var maximumFractionDigits = numberFormat.resolvedOptions().maximumFractionDigits || 0; | ||
var decimalSymbol = minimumFractionDigits > 0 ? ps.substr(ps.indexOf('6') + 1, 1) : null; | ||
var prefix = ps.substring(0, ps.indexOf('1')); | ||
var negativePrefix = ns.substring(0, ns.indexOf('1')); | ||
var suffix = ps.substring(ps.lastIndexOf(decimalLength > 0 ? '0' : '6') + 1); | ||
var suffix = ps.substring(ps.lastIndexOf(minimumFractionDigits > 0 ? '0' : '6') + 1); | ||
var groupingSymbol = ps.substr(ps.indexOf('3') + 1, 1); | ||
@@ -24,3 +25,4 @@ return { | ||
decimalSymbol: decimalSymbol, | ||
decimalLength: decimalLength | ||
minimumFractionDigits: minimumFractionDigits, | ||
maximumFractionDigits: maximumFractionDigits | ||
} | ||
@@ -31,11 +33,17 @@ }; | ||
var currency = ref.currency; | ||
var decimalLength = ref.decimalLength; | ||
var precision = ref.precision; | ||
var autoDecimalMode = ref.autoDecimalMode; | ||
var valueAsInteger = ref.valueAsInteger; | ||
var minimumFractionDigits = 2; | ||
if (decimalLength !== undefined) { | ||
minimumFractionDigits = decimalLength; | ||
var maximumFractionDigits = 2; | ||
if (typeof precision === 'number') { | ||
minimumFractionDigits = maximumFractionDigits = precision; | ||
} else if (typeof precision === 'object' && !autoDecimalMode && !valueAsInteger) { | ||
minimumFractionDigits = precision.min || 0; | ||
maximumFractionDigits = precision.max !== undefined ? precision.max : 20; | ||
} | ||
if (currency == null) { | ||
return createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits })) | ||
return createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits, maximumFractionDigits: maximumFractionDigits })) | ||
} else if (typeof currency === 'object') { | ||
return Object.assign({}, createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits })), | ||
return Object.assign({}, createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits, maximumFractionDigits: maximumFractionDigits })), | ||
{prefix: currency.prefix || '', | ||
@@ -45,5 +53,10 @@ negativePrefix: ("-" + (currency.prefix || '')), | ||
} else { | ||
var currencyFormat = createCurrencyFormat(new Intl.NumberFormat(locale, { style: 'currency', currency: currency })); | ||
if (currencyFormat.decimalLength > 0 && decimalLength !== undefined) { | ||
currencyFormat.decimalLength = decimalLength; | ||
var currencyFormat = createCurrencyFormat(new Intl.NumberFormat(locale, { currency: currency, style: 'currency' })); | ||
if (precision !== undefined) { | ||
if (currencyFormat.minimumFractionDigits > 0) { | ||
currencyFormat.minimumFractionDigits = minimumFractionDigits; | ||
} | ||
if (currencyFormat.maximumFractionDigits > 0) { | ||
currencyFormat.maximumFractionDigits = maximumFractionDigits; | ||
} | ||
} | ||
@@ -63,14 +76,2 @@ return currencyFormat | ||
}; | ||
var removePrefix = function (str, prefix) { | ||
if (prefix && startsWith(str, prefix)) { | ||
return str.substr(prefix.length) | ||
} | ||
return str | ||
}; | ||
var removeSuffix = function (str, suffix) { | ||
if (suffix && endsWith(str, suffix)) { | ||
return str.slice(0, suffix.length * -1) | ||
} | ||
return str | ||
}; | ||
var stripCurrencySymbolAndMinusSign = function (str, ref) { | ||
@@ -81,3 +82,3 @@ var prefix = ref.prefix; | ||
return { | ||
value: removePrefix(value, '-'), | ||
value: value.replace('-', ''), | ||
negative: startsWith(value, '-') | ||
@@ -88,5 +89,9 @@ } | ||
var getNumber = function (number, valueAsInteger, decimalLength) { | ||
return number != null && valueAsInteger ? Number(number.toFixed(decimalLength).split('.').join('')) : number | ||
var toInteger = function (number, valueAsInteger, fractionDigits) { | ||
return valueAsInteger ? Number(number.toFixed(fractionDigits).split('.').join('')) : number | ||
}; | ||
var toFloat = function (number, valueAsInteger, fractionDigits) { | ||
return valueAsInteger ? number / Math.pow(10, fractionDigits) : number | ||
}; | ||
function parse (str, currencyFormat, valueAsInteger) { | ||
@@ -96,3 +101,3 @@ if ( valueAsInteger === void 0 ) valueAsInteger = false; | ||
if (isNumber(str)) { | ||
return getNumber(Number(str), valueAsInteger, currencyFormat.decimalLength) | ||
return toInteger(Number(str), valueAsInteger, currencyFormat.minimumFractionDigits) | ||
} | ||
@@ -122,3 +127,3 @@ var ref = stripCurrencySymbolAndMinusSign(str, currencyFormat); | ||
} | ||
return getNumber(Number(number), valueAsInteger, currencyFormat.decimalLength) | ||
return toInteger(Number(number), valueAsInteger, currencyFormat.minimumFractionDigits) | ||
} | ||
@@ -136,3 +141,3 @@ } | ||
distractionFree: true, | ||
decimalLength: undefined, | ||
precision: undefined, | ||
autoDecimalMode: false, | ||
@@ -148,3 +153,3 @@ min: null, | ||
var decimalSymbol = currencyFormat.decimalSymbol; | ||
var decimalLength = currencyFormat.decimalLength; | ||
var maximumFractionDigits = currencyFormat.maximumFractionDigits; | ||
var groupingSymbol = currencyFormat.groupingSymbol; | ||
@@ -159,3 +164,3 @@ var decimalSymbolPosition = inputtedValue.indexOf(decimalSymbol) + 1; | ||
if (!options.autoDecimalMode && decimalSymbolPosition !== 0 && caretPosition > decimalSymbolPosition) { | ||
if (onlyDigits(removeSuffix(inputtedValue.substr(decimalSymbolPosition), suffix)).length - 1 === decimalLength) { | ||
if (onlyDigits(inputtedValue.substr(decimalSymbolPosition)).length - 1 === maximumFractionDigits) { | ||
caretPositionFromLeft -= 1; | ||
@@ -192,10 +197,10 @@ } | ||
var decimalSymbol = formatConfig.decimalSymbol; | ||
var decimalLength = formatConfig.decimalLength; | ||
var maximumFractionDigits = formatConfig.maximumFractionDigits; | ||
if (value === '' && negative && previousConformedValue !== negativePrefix) { | ||
return ("" + negativePrefix + suffix) | ||
} else if (decimalLength > 0) { | ||
} else if (maximumFractionDigits > 0) { | ||
if (isFractionIncomplete(value, formatConfig)) { | ||
return ("" + (negative ? negativePrefix : prefix) + value + suffix) | ||
} else if (startsWith(value, decimalSymbol)) { | ||
return ((negative ? negativePrefix : prefix) + "0" + decimalSymbol + ((onlyDigits(value.substr(1)).substr(0, decimalLength))) + suffix) | ||
return ((negative ? negativePrefix : prefix) + "0" + decimalSymbol + ((onlyDigits(value.substr(1)).substr(0, maximumFractionDigits))) + suffix) | ||
} | ||
@@ -206,3 +211,3 @@ } | ||
var getAutoDecimalModeConformedValue = function (value, previousConformedValue, ref) { | ||
var decimalLength = ref.decimalLength; | ||
var minimumFractionDigits = ref.minimumFractionDigits; | ||
if (value === '') { | ||
@@ -212,6 +217,6 @@ return { conformedValue: '' } | ||
var negative = startsWith(value, '-'); | ||
var conformedValue = value === '-' ? Number(-0) : Number(("" + (negative ? '-' : '') + (removeLeadingZeros(onlyDigits(value))))) / Math.pow(10, decimalLength); | ||
var conformedValue = value === '-' ? Number(-0) : Number(("" + (negative ? '-' : '') + (removeLeadingZeros(onlyDigits(value))))) / Math.pow(10, minimumFractionDigits); | ||
return { | ||
conformedValue: conformedValue, | ||
fractionDigits: conformedValue.toFixed(decimalLength).slice(-decimalLength) | ||
fractionDigits: conformedValue.toFixed(minimumFractionDigits).slice(-minimumFractionDigits) | ||
} | ||
@@ -225,3 +230,3 @@ } | ||
str = str.trim(); | ||
if (options.autoDecimalMode) { | ||
if (formatConfig.minimumFractionDigits > 0 && options.autoDecimalMode) { | ||
return getAutoDecimalModeConformedValue(str, previousConformedValue, formatConfig) | ||
@@ -240,3 +245,3 @@ } | ||
var integerDigits = removeLeadingZeros(onlyDigits(integer)); | ||
var fractionDigits = onlyDigits(fraction.join('')).substr(0, formatConfig.decimalLength); | ||
var fractionDigits = onlyDigits(fraction.join('')).substr(0, formatConfig.maximumFractionDigits); | ||
if (isFractionInvalid(fraction, fractionDigits.length)) { | ||
@@ -269,2 +274,19 @@ return { conformedValue: previousConformedValue } | ||
var equal = function (a, b) { | ||
if (a === b) { | ||
return true | ||
} | ||
if (a.valueOf !== Object.prototype.valueOf) { | ||
return a.valueOf() === b.valueOf() | ||
} | ||
var keys = Object.keys(a); | ||
if (keys.length !== Object.keys(b).length) { | ||
return false | ||
} | ||
if (!keys.every(Object.prototype.hasOwnProperty.bind(b))) { | ||
return false | ||
} | ||
return keys.every(function (key) { return equal(a[key], b[key]); }) | ||
}; | ||
var init = function (el, optionsFromBinding, defaultOptions) { | ||
@@ -305,11 +327,13 @@ var inputElement = el.tagName.toLowerCase() === 'input' ? el : el.querySelector('input'); | ||
var locale = ref_options.locale; | ||
var decimalLength = ref.currencyFormat.decimalLength; | ||
var ref_currencyFormat = ref.currencyFormat; | ||
var minimumFractionDigits = ref_currencyFormat.minimumFractionDigits; | ||
var maximumFractionDigits = ref_currencyFormat.maximumFractionDigits; | ||
if (min != null && (value == null || value < min)) { | ||
value = min; | ||
} | ||
if (max != null && value > max) { | ||
value = max; | ||
} | ||
if (value != null) { | ||
if (min != null && value < min) { | ||
value = min; | ||
} | ||
if (max != null && value > max) { | ||
value = max; | ||
} | ||
value = new Intl.NumberFormat(locale, { minimumFractionDigits: decimalLength, maximumFractionDigits: decimalLength }).format(value); | ||
value = new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits, maximumFractionDigits: maximumFractionDigits }).format(value); | ||
} | ||
@@ -339,3 +363,4 @@ format(el, value); | ||
useGrouping: !hideGroupingSymbolOnFocus(el), | ||
minimumFractionDigits: hideNegligibleDecimalDigitsOnFocus(el) ? fractionDigits.replace(/0+$/, '').length : Math.min(formatConfig.decimalLength, fractionDigits.length) | ||
minimumFractionDigits: hideNegligibleDecimalDigitsOnFocus(el) ? fractionDigits.replace(/0+$/, '').length : Math.min(formatConfig.minimumFractionDigits, fractionDigits.length), | ||
maximumFractionDigits: formatConfig.maximumFractionDigits | ||
}).format(Math.abs(conformedValue)); | ||
@@ -347,3 +372,3 @@ var isNegativeZero = conformedValue === 0 && (1 / conformedValue < 0); | ||
el.value = conformedValue; | ||
el.$ci.numberValue = parse(el.value, formatConfig, options.valueAsInteger); | ||
el.$ci.numberValue = parse(el.value, formatConfig, false); | ||
} | ||
@@ -357,11 +382,11 @@ } else { | ||
updateInputValue(el, value); | ||
var numberValue = getNumber(el.$ci.numberValue, el.$ci.options.valueAsInteger, el.$ci.currencyFormat.decimalLength); | ||
var ref = el.$ci; | ||
var numberValue = ref.numberValue; | ||
var currencyFormat = ref.currencyFormat; | ||
var options = ref.options; | ||
if (numberValue != null) { | ||
numberValue = toInteger(numberValue, options.valueAsInteger, currencyFormat.maximumFractionDigits); | ||
} | ||
dispatchEvent(el, 'format-complete', { numberValue: numberValue }); | ||
}; | ||
var toFloat = function (number, options, currencyFormat) { | ||
if (options.valueAsInteger) { | ||
return number / Math.pow(10, currencyFormat.decimalLength) | ||
} | ||
return number | ||
}; | ||
var addEventListener = function (el) { | ||
@@ -386,3 +411,3 @@ el.addEventListener('input', function () { | ||
if (!focus) { | ||
applyFixedFractionFormat(el, toFloat(detail.value, options, currencyFormat)); | ||
applyFixedFractionFormat(el, toFloat(detail.value, options.valueAsInteger, currencyFormat.maximumFractionDigits)); | ||
} | ||
@@ -421,5 +446,3 @@ }); | ||
var options = inputElement_$ci.options; | ||
if (value) { | ||
applyFixedFractionFormat(inputElement, toFloat(parse(value, currencyFormat), options, currencyFormat)); | ||
} | ||
applyFixedFractionFormat(inputElement, toFloat(parse(value, currencyFormat), options.valueAsInteger, currencyFormat.maximumFractionDigits)); | ||
}); | ||
@@ -432,3 +455,3 @@ addEventListener(inputElement); | ||
var context = ref$1.context; | ||
if (!!value && Object.keys(DEFAULT_OPTIONS).some(function (key) { return oldValue[key] !== value[key]; })) { | ||
if (!equal(value, oldValue)) { | ||
var inputElement = init(el, value, context.$CI_DEFAULT_OPTIONS || DEFAULT_OPTIONS); | ||
@@ -475,4 +498,4 @@ applyFixedFractionFormat(inputElement, inputElement.$ci.numberValue); | ||
}, | ||
decimalLength: { | ||
type: Number, | ||
precision: { | ||
type: [Number, Object], | ||
default: undefined | ||
@@ -479,0 +502,0 @@ }, |
/** | ||
* Vue Currency Input 1.12.1 | ||
* Vue Currency Input 1.13.0 | ||
* (c) 2019 Matthias Stiller | ||
@@ -17,7 +17,8 @@ * @license MIT | ||
var ns = numberFormat.format(-1); | ||
var decimalLength = (ps.match(/0/g) || []).length; | ||
var decimalSymbol = decimalLength > 0 ? ps.substr(ps.indexOf('6') + 1, 1) : null; | ||
var minimumFractionDigits = numberFormat.resolvedOptions().minimumFractionDigits || 0; | ||
var maximumFractionDigits = numberFormat.resolvedOptions().maximumFractionDigits || 0; | ||
var decimalSymbol = minimumFractionDigits > 0 ? ps.substr(ps.indexOf('6') + 1, 1) : null; | ||
var prefix = ps.substring(0, ps.indexOf('1')); | ||
var negativePrefix = ns.substring(0, ns.indexOf('1')); | ||
var suffix = ps.substring(ps.lastIndexOf(decimalLength > 0 ? '0' : '6') + 1); | ||
var suffix = ps.substring(ps.lastIndexOf(minimumFractionDigits > 0 ? '0' : '6') + 1); | ||
var groupingSymbol = ps.substr(ps.indexOf('3') + 1, 1); | ||
@@ -30,3 +31,4 @@ return { | ||
decimalSymbol: decimalSymbol, | ||
decimalLength: decimalLength | ||
minimumFractionDigits: minimumFractionDigits, | ||
maximumFractionDigits: maximumFractionDigits | ||
} | ||
@@ -37,11 +39,17 @@ }; | ||
var currency = ref.currency; | ||
var decimalLength = ref.decimalLength; | ||
var precision = ref.precision; | ||
var autoDecimalMode = ref.autoDecimalMode; | ||
var valueAsInteger = ref.valueAsInteger; | ||
var minimumFractionDigits = 2; | ||
if (decimalLength !== undefined) { | ||
minimumFractionDigits = decimalLength; | ||
var maximumFractionDigits = 2; | ||
if (typeof precision === 'number') { | ||
minimumFractionDigits = maximumFractionDigits = precision; | ||
} else if (typeof precision === 'object' && !autoDecimalMode && !valueAsInteger) { | ||
minimumFractionDigits = precision.min || 0; | ||
maximumFractionDigits = precision.max !== undefined ? precision.max : 20; | ||
} | ||
if (currency == null) { | ||
return createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits })) | ||
return createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits, maximumFractionDigits: maximumFractionDigits })) | ||
} else if (typeof currency === 'object') { | ||
return Object.assign({}, createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits })), | ||
return Object.assign({}, createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits, maximumFractionDigits: maximumFractionDigits })), | ||
{prefix: currency.prefix || '', | ||
@@ -51,5 +59,10 @@ negativePrefix: ("-" + (currency.prefix || '')), | ||
} else { | ||
var currencyFormat = createCurrencyFormat(new Intl.NumberFormat(locale, { style: 'currency', currency: currency })); | ||
if (currencyFormat.decimalLength > 0 && decimalLength !== undefined) { | ||
currencyFormat.decimalLength = decimalLength; | ||
var currencyFormat = createCurrencyFormat(new Intl.NumberFormat(locale, { currency: currency, style: 'currency' })); | ||
if (precision !== undefined) { | ||
if (currencyFormat.minimumFractionDigits > 0) { | ||
currencyFormat.minimumFractionDigits = minimumFractionDigits; | ||
} | ||
if (currencyFormat.maximumFractionDigits > 0) { | ||
currencyFormat.maximumFractionDigits = maximumFractionDigits; | ||
} | ||
} | ||
@@ -69,14 +82,2 @@ return currencyFormat | ||
}; | ||
var removePrefix = function (str, prefix) { | ||
if (prefix && startsWith(str, prefix)) { | ||
return str.substr(prefix.length) | ||
} | ||
return str | ||
}; | ||
var removeSuffix = function (str, suffix) { | ||
if (suffix && endsWith(str, suffix)) { | ||
return str.slice(0, suffix.length * -1) | ||
} | ||
return str | ||
}; | ||
var stripCurrencySymbolAndMinusSign = function (str, ref) { | ||
@@ -87,3 +88,3 @@ var prefix = ref.prefix; | ||
return { | ||
value: removePrefix(value, '-'), | ||
value: value.replace('-', ''), | ||
negative: startsWith(value, '-') | ||
@@ -94,5 +95,9 @@ } | ||
var getNumber = function (number, valueAsInteger, decimalLength) { | ||
return number != null && valueAsInteger ? Number(number.toFixed(decimalLength).split('.').join('')) : number | ||
var toInteger = function (number, valueAsInteger, fractionDigits) { | ||
return valueAsInteger ? Number(number.toFixed(fractionDigits).split('.').join('')) : number | ||
}; | ||
var toFloat = function (number, valueAsInteger, fractionDigits) { | ||
return valueAsInteger ? number / Math.pow(10, fractionDigits) : number | ||
}; | ||
function parse (str, currencyFormat, valueAsInteger) { | ||
@@ -102,3 +107,3 @@ if ( valueAsInteger === void 0 ) valueAsInteger = false; | ||
if (isNumber(str)) { | ||
return getNumber(Number(str), valueAsInteger, currencyFormat.decimalLength) | ||
return toInteger(Number(str), valueAsInteger, currencyFormat.minimumFractionDigits) | ||
} | ||
@@ -128,3 +133,3 @@ var ref = stripCurrencySymbolAndMinusSign(str, currencyFormat); | ||
} | ||
return getNumber(Number(number), valueAsInteger, currencyFormat.decimalLength) | ||
return toInteger(Number(number), valueAsInteger, currencyFormat.minimumFractionDigits) | ||
} | ||
@@ -142,3 +147,3 @@ } | ||
distractionFree: true, | ||
decimalLength: undefined, | ||
precision: undefined, | ||
autoDecimalMode: false, | ||
@@ -154,3 +159,3 @@ min: null, | ||
var decimalSymbol = currencyFormat.decimalSymbol; | ||
var decimalLength = currencyFormat.decimalLength; | ||
var maximumFractionDigits = currencyFormat.maximumFractionDigits; | ||
var groupingSymbol = currencyFormat.groupingSymbol; | ||
@@ -165,3 +170,3 @@ var decimalSymbolPosition = inputtedValue.indexOf(decimalSymbol) + 1; | ||
if (!options.autoDecimalMode && decimalSymbolPosition !== 0 && caretPosition > decimalSymbolPosition) { | ||
if (onlyDigits(removeSuffix(inputtedValue.substr(decimalSymbolPosition), suffix)).length - 1 === decimalLength) { | ||
if (onlyDigits(inputtedValue.substr(decimalSymbolPosition)).length - 1 === maximumFractionDigits) { | ||
caretPositionFromLeft -= 1; | ||
@@ -198,10 +203,10 @@ } | ||
var decimalSymbol = formatConfig.decimalSymbol; | ||
var decimalLength = formatConfig.decimalLength; | ||
var maximumFractionDigits = formatConfig.maximumFractionDigits; | ||
if (value === '' && negative && previousConformedValue !== negativePrefix) { | ||
return ("" + negativePrefix + suffix) | ||
} else if (decimalLength > 0) { | ||
} else if (maximumFractionDigits > 0) { | ||
if (isFractionIncomplete(value, formatConfig)) { | ||
return ("" + (negative ? negativePrefix : prefix) + value + suffix) | ||
} else if (startsWith(value, decimalSymbol)) { | ||
return ((negative ? negativePrefix : prefix) + "0" + decimalSymbol + ((onlyDigits(value.substr(1)).substr(0, decimalLength))) + suffix) | ||
return ((negative ? negativePrefix : prefix) + "0" + decimalSymbol + ((onlyDigits(value.substr(1)).substr(0, maximumFractionDigits))) + suffix) | ||
} | ||
@@ -212,3 +217,3 @@ } | ||
var getAutoDecimalModeConformedValue = function (value, previousConformedValue, ref) { | ||
var decimalLength = ref.decimalLength; | ||
var minimumFractionDigits = ref.minimumFractionDigits; | ||
if (value === '') { | ||
@@ -218,6 +223,6 @@ return { conformedValue: '' } | ||
var negative = startsWith(value, '-'); | ||
var conformedValue = value === '-' ? Number(-0) : Number(("" + (negative ? '-' : '') + (removeLeadingZeros(onlyDigits(value))))) / Math.pow(10, decimalLength); | ||
var conformedValue = value === '-' ? Number(-0) : Number(("" + (negative ? '-' : '') + (removeLeadingZeros(onlyDigits(value))))) / Math.pow(10, minimumFractionDigits); | ||
return { | ||
conformedValue: conformedValue, | ||
fractionDigits: conformedValue.toFixed(decimalLength).slice(-decimalLength) | ||
fractionDigits: conformedValue.toFixed(minimumFractionDigits).slice(-minimumFractionDigits) | ||
} | ||
@@ -231,3 +236,3 @@ } | ||
str = str.trim(); | ||
if (options.autoDecimalMode) { | ||
if (formatConfig.minimumFractionDigits > 0 && options.autoDecimalMode) { | ||
return getAutoDecimalModeConformedValue(str, previousConformedValue, formatConfig) | ||
@@ -246,3 +251,3 @@ } | ||
var integerDigits = removeLeadingZeros(onlyDigits(integer)); | ||
var fractionDigits = onlyDigits(fraction.join('')).substr(0, formatConfig.decimalLength); | ||
var fractionDigits = onlyDigits(fraction.join('')).substr(0, formatConfig.maximumFractionDigits); | ||
if (isFractionInvalid(fraction, fractionDigits.length)) { | ||
@@ -275,2 +280,19 @@ return { conformedValue: previousConformedValue } | ||
var equal = function (a, b) { | ||
if (a === b) { | ||
return true | ||
} | ||
if (a.valueOf !== Object.prototype.valueOf) { | ||
return a.valueOf() === b.valueOf() | ||
} | ||
var keys = Object.keys(a); | ||
if (keys.length !== Object.keys(b).length) { | ||
return false | ||
} | ||
if (!keys.every(Object.prototype.hasOwnProperty.bind(b))) { | ||
return false | ||
} | ||
return keys.every(function (key) { return equal(a[key], b[key]); }) | ||
}; | ||
var init = function (el, optionsFromBinding, defaultOptions) { | ||
@@ -311,11 +333,13 @@ var inputElement = el.tagName.toLowerCase() === 'input' ? el : el.querySelector('input'); | ||
var locale = ref_options.locale; | ||
var decimalLength = ref.currencyFormat.decimalLength; | ||
var ref_currencyFormat = ref.currencyFormat; | ||
var minimumFractionDigits = ref_currencyFormat.minimumFractionDigits; | ||
var maximumFractionDigits = ref_currencyFormat.maximumFractionDigits; | ||
if (min != null && (value == null || value < min)) { | ||
value = min; | ||
} | ||
if (max != null && value > max) { | ||
value = max; | ||
} | ||
if (value != null) { | ||
if (min != null && value < min) { | ||
value = min; | ||
} | ||
if (max != null && value > max) { | ||
value = max; | ||
} | ||
value = new Intl.NumberFormat(locale, { minimumFractionDigits: decimalLength, maximumFractionDigits: decimalLength }).format(value); | ||
value = new Intl.NumberFormat(locale, { minimumFractionDigits: minimumFractionDigits, maximumFractionDigits: maximumFractionDigits }).format(value); | ||
} | ||
@@ -345,3 +369,4 @@ format(el, value); | ||
useGrouping: !hideGroupingSymbolOnFocus(el), | ||
minimumFractionDigits: hideNegligibleDecimalDigitsOnFocus(el) ? fractionDigits.replace(/0+$/, '').length : Math.min(formatConfig.decimalLength, fractionDigits.length) | ||
minimumFractionDigits: hideNegligibleDecimalDigitsOnFocus(el) ? fractionDigits.replace(/0+$/, '').length : Math.min(formatConfig.minimumFractionDigits, fractionDigits.length), | ||
maximumFractionDigits: formatConfig.maximumFractionDigits | ||
}).format(Math.abs(conformedValue)); | ||
@@ -353,3 +378,3 @@ var isNegativeZero = conformedValue === 0 && (1 / conformedValue < 0); | ||
el.value = conformedValue; | ||
el.$ci.numberValue = parse(el.value, formatConfig, options.valueAsInteger); | ||
el.$ci.numberValue = parse(el.value, formatConfig, false); | ||
} | ||
@@ -363,11 +388,11 @@ } else { | ||
updateInputValue(el, value); | ||
var numberValue = getNumber(el.$ci.numberValue, el.$ci.options.valueAsInteger, el.$ci.currencyFormat.decimalLength); | ||
var ref = el.$ci; | ||
var numberValue = ref.numberValue; | ||
var currencyFormat = ref.currencyFormat; | ||
var options = ref.options; | ||
if (numberValue != null) { | ||
numberValue = toInteger(numberValue, options.valueAsInteger, currencyFormat.maximumFractionDigits); | ||
} | ||
dispatchEvent(el, 'format-complete', { numberValue: numberValue }); | ||
}; | ||
var toFloat = function (number, options, currencyFormat) { | ||
if (options.valueAsInteger) { | ||
return number / Math.pow(10, currencyFormat.decimalLength) | ||
} | ||
return number | ||
}; | ||
var addEventListener = function (el) { | ||
@@ -392,3 +417,3 @@ el.addEventListener('input', function () { | ||
if (!focus) { | ||
applyFixedFractionFormat(el, toFloat(detail.value, options, currencyFormat)); | ||
applyFixedFractionFormat(el, toFloat(detail.value, options.valueAsInteger, currencyFormat.maximumFractionDigits)); | ||
} | ||
@@ -427,5 +452,3 @@ }); | ||
var options = inputElement_$ci.options; | ||
if (value) { | ||
applyFixedFractionFormat(inputElement, toFloat(parse(value, currencyFormat), options, currencyFormat)); | ||
} | ||
applyFixedFractionFormat(inputElement, toFloat(parse(value, currencyFormat), options.valueAsInteger, currencyFormat.maximumFractionDigits)); | ||
}); | ||
@@ -438,3 +461,3 @@ addEventListener(inputElement); | ||
var context = ref$1.context; | ||
if (!!value && Object.keys(DEFAULT_OPTIONS).some(function (key) { return oldValue[key] !== value[key]; })) { | ||
if (!equal(value, oldValue)) { | ||
var inputElement = init(el, value, context.$CI_DEFAULT_OPTIONS || DEFAULT_OPTIONS); | ||
@@ -481,4 +504,4 @@ applyFixedFractionFormat(inputElement, inputElement.$ci.numberValue); | ||
}, | ||
decimalLength: { | ||
type: Number, | ||
precision: { | ||
type: [Number, Object], | ||
default: undefined | ||
@@ -485,0 +508,0 @@ }, |
{ | ||
"name": "vue-currency-input", | ||
"description": "Easy input of currency formatted numbers for Vue.js.", | ||
"version": "1.12.1", | ||
"version": "1.13.0", | ||
"license": "MIT", | ||
@@ -33,3 +33,3 @@ "unpkg": "dist/vue-currency-input.umd.js", | ||
"lint": "vue-cli-service lint", | ||
"test:unit": "vue-cli-service test:unit --silent", | ||
"test:unit": "vue-cli-service test:unit", | ||
"docs:dev": "vuepress dev docs", | ||
@@ -36,0 +36,0 @@ "docs:build": "vuepress build docs" |
@@ -39,4 +39,4 @@ import defaultOptions from './defaultOptions' | ||
}, | ||
decimalLength: { | ||
type: Number, | ||
precision: { | ||
type: [Number, Object], | ||
default: undefined | ||
@@ -43,0 +43,0 @@ }, |
@@ -6,3 +6,3 @@ export default { | ||
distractionFree: true, | ||
decimalLength: undefined, | ||
precision: undefined, | ||
autoDecimalMode: false, | ||
@@ -9,0 +9,0 @@ min: null, |
@@ -7,3 +7,5 @@ import Vue from 'vue' | ||
import dispatchEvent from './utils/dispatchEvent' | ||
import parse, { getNumber } from './utils/parse' | ||
import parse from './utils/parse' | ||
import equal from './utils/equal' | ||
import { toFloat, toInteger } from './utils/numberUtils' | ||
@@ -40,11 +42,11 @@ const init = (el, optionsFromBinding, defaultOptions) => { | ||
const applyFixedFractionFormat = (el, value) => { | ||
const { options: { min, max, locale }, currencyFormat: { decimalLength } } = el.$ci | ||
const { options: { min, max, locale }, currencyFormat: { minimumFractionDigits, maximumFractionDigits } } = el.$ci | ||
if (min != null && (value == null || value < min)) { | ||
value = min | ||
} | ||
if (max != null && value > max) { | ||
value = max | ||
} | ||
if (value != null) { | ||
if (min != null && value < min) { | ||
value = min | ||
} | ||
if (max != null && value > max) { | ||
value = max | ||
} | ||
value = new Intl.NumberFormat(locale, { minimumFractionDigits: decimalLength, maximumFractionDigits: decimalLength }).format(value) | ||
value = new Intl.NumberFormat(locale, { minimumFractionDigits, maximumFractionDigits }).format(value) | ||
} | ||
@@ -73,3 +75,4 @@ format(el, value) | ||
useGrouping: !hideGroupingSymbolOnFocus(el), | ||
minimumFractionDigits: hideNegligibleDecimalDigitsOnFocus(el) ? fractionDigits.replace(/0+$/, '').length : Math.min(formatConfig.decimalLength, fractionDigits.length) | ||
minimumFractionDigits: hideNegligibleDecimalDigitsOnFocus(el) ? fractionDigits.replace(/0+$/, '').length : Math.min(formatConfig.minimumFractionDigits, fractionDigits.length), | ||
maximumFractionDigits: formatConfig.maximumFractionDigits | ||
}).format(Math.abs(conformedValue)) | ||
@@ -81,3 +84,3 @@ const isNegativeZero = conformedValue === 0 && (1 / conformedValue < 0) | ||
el.value = conformedValue | ||
el.$ci.numberValue = parse(el.value, formatConfig, options.valueAsInteger) | ||
el.$ci.numberValue = parse(el.value, formatConfig, false) | ||
} | ||
@@ -92,13 +95,9 @@ } else { | ||
updateInputValue(el, value) | ||
const numberValue = getNumber(el.$ci.numberValue, el.$ci.options.valueAsInteger, el.$ci.currencyFormat.decimalLength) | ||
let { numberValue, currencyFormat, options } = el.$ci | ||
if (numberValue != null) { | ||
numberValue = toInteger(numberValue, options.valueAsInteger, currencyFormat.maximumFractionDigits) | ||
} | ||
dispatchEvent(el, 'format-complete', { numberValue }) | ||
} | ||
const toFloat = (number, options, currencyFormat) => { | ||
if (options.valueAsInteger) { | ||
return number / Math.pow(10, currencyFormat.decimalLength) | ||
} | ||
return number | ||
} | ||
const addEventListener = (el) => { | ||
@@ -116,3 +115,3 @@ el.addEventListener('input', () => { | ||
if (!focus) { | ||
applyFixedFractionFormat(el, toFloat(detail.value, options, currencyFormat)) | ||
applyFixedFractionFormat(el, toFloat(detail.value, options.valueAsInteger, currencyFormat.maximumFractionDigits)) | ||
} | ||
@@ -147,5 +146,3 @@ }) | ||
const { value, $ci: { currencyFormat, options } } = inputElement | ||
if (value) { | ||
applyFixedFractionFormat(inputElement, toFloat(parse(value, currencyFormat), options, currencyFormat)) | ||
} | ||
applyFixedFractionFormat(inputElement, toFloat(parse(value, currencyFormat), options.valueAsInteger, currencyFormat.maximumFractionDigits)) | ||
}) | ||
@@ -155,3 +152,3 @@ addEventListener(inputElement) | ||
componentUpdated (el, { value, oldValue }, { context }) { | ||
if (!!value && Object.keys(defaultOptions).some((key) => oldValue[key] !== value[key])) { | ||
if (!equal(value, oldValue)) { | ||
const inputElement = init(el, value, context.$CI_DEFAULT_OPTIONS || defaultOptions) | ||
@@ -158,0 +155,0 @@ applyFixedFractionFormat(inputElement, inputElement.$ci.numberValue) |
@@ -14,2 +14,7 @@ import Vue, { Component, DirectiveOptions } from 'vue' | ||
interface PrecisionOptions { | ||
min: number, | ||
max: number | ||
} | ||
interface CurrencyInputOptions { | ||
@@ -20,3 +25,3 @@ locale: string, | ||
distractionFree: boolean | DistractionFreeOptions, | ||
decimalLength: number, | ||
precision: number | PrecisionOptions, | ||
autoDecimalMode: boolean, | ||
@@ -23,0 +28,0 @@ min: number, |
@@ -1,2 +0,2 @@ | ||
import { count, onlyDigits, removeSuffix } from './formatHelper' | ||
import { count, onlyDigits } from './stringUtils' | ||
@@ -6,3 +6,3 @@ export const setCaretPosition = (el, position) => el.setSelectionRange(position, position) | ||
export const getCaretPositionAfterFormat = (newValue, inputtedValue, caretPosition, currencyFormat, options) => { | ||
const { prefix, suffix, decimalSymbol, decimalLength, groupingSymbol } = currencyFormat | ||
const { prefix, suffix, decimalSymbol, maximumFractionDigits, groupingSymbol } = currencyFormat | ||
const decimalSymbolPosition = inputtedValue.indexOf(decimalSymbol) + 1 | ||
@@ -17,3 +17,3 @@ let caretPositionFromLeft = inputtedValue.length - caretPosition | ||
if (!options.autoDecimalMode && decimalSymbolPosition !== 0 && caretPosition > decimalSymbolPosition) { | ||
if (onlyDigits(removeSuffix(inputtedValue.substr(decimalSymbolPosition), suffix)).length - 1 === decimalLength) { | ||
if (onlyDigits(inputtedValue.substr(decimalSymbolPosition)).length - 1 === maximumFractionDigits) { | ||
caretPositionFromLeft -= 1 | ||
@@ -20,0 +20,0 @@ } |
@@ -1,2 +0,2 @@ | ||
import { endsWith, isNumber, onlyDigits, removeLeadingZeros, startsWith, stripCurrencySymbolAndMinusSign } from './formatHelper' | ||
import { endsWith, isNumber, onlyDigits, removeLeadingZeros, startsWith, stripCurrencySymbolAndMinusSign } from './stringUtils' | ||
@@ -11,10 +11,10 @@ const isValidInteger = (integer, groupingSymbol) => integer.match(new RegExp(`^-?(0|[1-9]\\d{0,2}(\\${groupingSymbol}?\\d{3})*)$`)) | ||
const checkIncompleteValue = (value, negative, previousConformedValue, formatConfig) => { | ||
const { prefix, negativePrefix, suffix, decimalSymbol, decimalLength } = formatConfig | ||
const { prefix, negativePrefix, suffix, decimalSymbol, maximumFractionDigits } = formatConfig | ||
if (value === '' && negative && previousConformedValue !== negativePrefix) { | ||
return `${negativePrefix}${suffix}` | ||
} else if (decimalLength > 0) { | ||
} else if (maximumFractionDigits > 0) { | ||
if (isFractionIncomplete(value, formatConfig)) { | ||
return `${negative ? negativePrefix : prefix}${value}${suffix}` | ||
} else if (startsWith(value, decimalSymbol)) { | ||
return `${negative ? negativePrefix : prefix}0${decimalSymbol}${(onlyDigits(value.substr(1)).substr(0, decimalLength))}${suffix}` | ||
return `${negative ? negativePrefix : prefix}0${decimalSymbol}${(onlyDigits(value.substr(1)).substr(0, maximumFractionDigits))}${suffix}` | ||
} | ||
@@ -25,3 +25,3 @@ } | ||
const getAutoDecimalModeConformedValue = (value, previousConformedValue, { decimalLength }) => { | ||
const getAutoDecimalModeConformedValue = (value, previousConformedValue, { minimumFractionDigits }) => { | ||
if (value === '') { | ||
@@ -31,6 +31,6 @@ return { conformedValue: '' } | ||
const negative = startsWith(value, '-') | ||
const conformedValue = value === '-' ? Number(-0) : Number(`${negative ? '-' : ''}${removeLeadingZeros(onlyDigits(value))}`) / Math.pow(10, decimalLength) | ||
const conformedValue = value === '-' ? Number(-0) : Number(`${negative ? '-' : ''}${removeLeadingZeros(onlyDigits(value))}`) / Math.pow(10, minimumFractionDigits) | ||
return { | ||
conformedValue, | ||
fractionDigits: conformedValue.toFixed(decimalLength).slice(-decimalLength) | ||
fractionDigits: conformedValue.toFixed(minimumFractionDigits).slice(-minimumFractionDigits) | ||
} | ||
@@ -46,3 +46,3 @@ } | ||
if (options.autoDecimalMode) { | ||
if (formatConfig.minimumFractionDigits > 0 && options.autoDecimalMode) { | ||
return getAutoDecimalModeConformedValue(str, previousConformedValue, formatConfig) | ||
@@ -59,3 +59,3 @@ } | ||
const integerDigits = removeLeadingZeros(onlyDigits(integer)) | ||
const fractionDigits = onlyDigits(fraction.join('')).substr(0, formatConfig.decimalLength) | ||
const fractionDigits = onlyDigits(fraction.join('')).substr(0, formatConfig.maximumFractionDigits) | ||
@@ -62,0 +62,0 @@ if (isFractionInvalid(fraction, fractionDigits.length)) { |
const createCurrencyFormat = (numberFormat) => { | ||
const ps = numberFormat.format(123456) | ||
const ns = numberFormat.format(-1) | ||
const decimalLength = (ps.match(/0/g) || []).length | ||
const decimalSymbol = decimalLength > 0 ? ps.substr(ps.indexOf('6') + 1, 1) : null | ||
const minimumFractionDigits = numberFormat.resolvedOptions().minimumFractionDigits || 0 | ||
const maximumFractionDigits = numberFormat.resolvedOptions().maximumFractionDigits || 0 | ||
const decimalSymbol = minimumFractionDigits > 0 ? ps.substr(ps.indexOf('6') + 1, 1) : null | ||
const prefix = ps.substring(0, ps.indexOf('1')) | ||
const negativePrefix = ns.substring(0, ns.indexOf('1')) | ||
const suffix = ps.substring(ps.lastIndexOf(decimalLength > 0 ? '0' : '6') + 1) | ||
const suffix = ps.substring(ps.lastIndexOf(minimumFractionDigits > 0 ? '0' : '6') + 1) | ||
const groupingSymbol = ps.substr(ps.indexOf('3') + 1, 1) | ||
@@ -17,16 +18,21 @@ | ||
decimalSymbol, | ||
decimalLength | ||
minimumFractionDigits, | ||
maximumFractionDigits | ||
} | ||
} | ||
export default ({ locale, currency, decimalLength }) => { | ||
export default ({ locale, currency, precision, autoDecimalMode, valueAsInteger }) => { | ||
let minimumFractionDigits = 2 | ||
if (decimalLength !== undefined) { | ||
minimumFractionDigits = decimalLength | ||
let maximumFractionDigits = 2 | ||
if (typeof precision === 'number') { | ||
minimumFractionDigits = maximumFractionDigits = precision | ||
} else if (typeof precision === 'object' && !autoDecimalMode && !valueAsInteger) { | ||
minimumFractionDigits = precision.min || 0 | ||
maximumFractionDigits = precision.max !== undefined ? precision.max : 20 | ||
} | ||
if (currency == null) { | ||
return createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits })) | ||
return createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits, maximumFractionDigits })) | ||
} else if (typeof currency === 'object') { | ||
return { | ||
...createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits })), | ||
...createCurrencyFormat(new Intl.NumberFormat(locale, { minimumFractionDigits, maximumFractionDigits })), | ||
prefix: currency.prefix || '', | ||
@@ -37,5 +43,10 @@ negativePrefix: `-${currency.prefix || ''}`, | ||
} else { | ||
const currencyFormat = createCurrencyFormat(new Intl.NumberFormat(locale, { style: 'currency', currency })) | ||
if (currencyFormat.decimalLength > 0 && decimalLength !== undefined) { | ||
currencyFormat.decimalLength = decimalLength | ||
const currencyFormat = createCurrencyFormat(new Intl.NumberFormat(locale, { currency, style: 'currency' })) | ||
if (precision !== undefined) { | ||
if (currencyFormat.minimumFractionDigits > 0) { | ||
currencyFormat.minimumFractionDigits = minimumFractionDigits | ||
} | ||
if (currencyFormat.maximumFractionDigits > 0) { | ||
currencyFormat.maximumFractionDigits = maximumFractionDigits | ||
} | ||
} | ||
@@ -42,0 +53,0 @@ return currencyFormat |
@@ -1,11 +0,8 @@ | ||
import { isNumber, stripCurrencySymbolAndMinusSign } from './formatHelper' | ||
import { isNumber, stripCurrencySymbolAndMinusSign } from './stringUtils' | ||
import { toInteger } from './numberUtils' | ||
export const getNumber = (number, valueAsInteger, decimalLength) => { | ||
return number != null && valueAsInteger ? Number(number.toFixed(decimalLength).split('.').join('')) : number | ||
} | ||
export default (str, currencyFormat, valueAsInteger = false) => { | ||
if (typeof str === 'string') { | ||
if (isNumber(str)) { | ||
return getNumber(Number(str), valueAsInteger, currencyFormat.decimalLength) | ||
return toInteger(Number(str), valueAsInteger, currencyFormat.minimumFractionDigits) | ||
} | ||
@@ -33,3 +30,3 @@ let { value, negative } = stripCurrencySymbolAndMinusSign(str, currencyFormat) | ||
} | ||
return getNumber(Number(number), valueAsInteger, currencyFormat.decimalLength) | ||
return toInteger(Number(number), valueAsInteger, currencyFormat.minimumFractionDigits) | ||
} | ||
@@ -36,0 +33,0 @@ } |
70064
23
1653