diff --git a/src/Cleave.js b/src/Cleave.js index dcd8a125..1e488f96 100644 --- a/src/Cleave.js +++ b/src/Cleave.js @@ -277,7 +277,7 @@ Cleave.prototype = { value = Util.stripDelimiters(value, pps.delimiter, pps.delimiters); // strip prefix - value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix); + value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix); // strip non-numeric characters value = pps.numericOnly ? Util.strip(value, /[^\d]/g) : value; @@ -421,7 +421,7 @@ Cleave.prototype = { rawValue = owner.element.value; if (pps.rawValueTrimPrefix) { - rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix); + rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix); } if (pps.numeral) { diff --git a/src/Cleave.react.js b/src/Cleave.react.js index 6cb2de9c..f65d9441 100644 --- a/src/Cleave.react.js +++ b/src/Cleave.react.js @@ -207,7 +207,7 @@ var cleaveReactClass = CreateReactClass({ rawValue = pps.result; if (pps.rawValueTrimPrefix) { - rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix); + rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix); } if (pps.numeral) { @@ -346,7 +346,7 @@ var cleaveReactClass = CreateReactClass({ value = Util.stripDelimiters(value, pps.delimiter, pps.delimiters); // strip prefix - value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix); + value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix); // strip non-numeric characters value = pps.numericOnly ? Util.strip(value, /[^\d]/g) : value; diff --git a/src/utils/Util.js b/src/utils/Util.js index 20c63ba9..0ea32df1 100644 --- a/src/utils/Util.js +++ b/src/utils/Util.js @@ -85,12 +85,17 @@ var Util = { // PREFIX-123 | PEFIX-123 | 123 // PREFIX-123 | PREFIX-23 | 23 // PREFIX-123 | PREFIX-1234 | 1234 - getPrefixStrippedValue: function (value, prefix, prefixLength, prevResult, delimiter, delimiters, noImmediatePrefix, tailPrefix) { + getPrefixStrippedValue: function (value, prefix, prefixLength, prevResult, delimiter, delimiters, noImmediatePrefix, tailPrefix, signBeforePrefix) { // No prefix if (prefixLength === 0) { return value; } + if (signBeforePrefix && (value.slice(0, 1) == '-')) { + var prev = (prevResult.slice(0, 1) == '-') ? prevResult.slice(1) : prevResult; + return '-' + this.getPrefixStrippedValue(value.slice(1), prefix, prefixLength, prev, delimiter, delimiters, noImmediatePrefix, tailPrefix, signBeforePrefix); + } + // Pre result prefix string does not match pre-defined prefix if (prevResult.slice(0, prefixLength) !== prefix && !tailPrefix) { // Check if the first time user entered something diff --git a/test/fixtures/util.json b/test/fixtures/util.json index 531caa8d..5603f8ae 100644 --- a/test/fixtures/util.json +++ b/test/fixtures/util.json @@ -176,6 +176,20 @@ [] ], "expected": "12" + }, + { + "params": [ + "-test123", + "test", + 4, + "-test123", + "-", + [], + false, + false, + true + ], + "expected": "-123" } ] } diff --git a/test/unit/Util_spec.js b/test/unit/Util_spec.js index 6f62ff19..91ae1311 100644 --- a/test/unit/Util_spec.js +++ b/test/unit/Util_spec.js @@ -25,7 +25,7 @@ describe('Util', function () { _.each(json.getPrefixStrippedValue, function (data) { var params = data.params; it('should get prefix stripped value for: ' + params[0] + ' as: ' + data.expected, function () { - Util.getPrefixStrippedValue(params[0], params[1], params[2], params[3], params[4], params[5], params[6]).should.eql(data.expected); + Util.getPrefixStrippedValue(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7], params[8]).should.eql(data.expected); }); }); });