简体   繁体   中英

Regex To Find negative number in javascript

I am trying to solve below issue using javascript, let me know if someone came across similar problem and any pointer will be really helpful.

I am working on Currency format where different country can different representation for negative currency format.

Requirement: If a number start /end with - consider such value as negative. Similarly if a number start / end with () consider such value as negative.

-123.55 = > Negative True 
123.55 = > Negative False 
(123.55) => Negative True

My code :

 console.log('1234,56' + ' vs ' + formatNumber('1234,56', '', ',')); console.log('1234.56' + ' vs ' + formatNumber('1234.56', '', '.')); console.log('-1,234.567' + ' VS ' + formatNumber('-1,234.567', ',', '.')); console.log('1,234.567-' + ' VS ' + formatNumber('1,234.567-', ',', '.')); console.log("1'234,567-" + " VS " + formatNumber("1'234,567-", "'", ',')); console.log("1'234.567-" + " VS " + formatNumber("1'234.567-", "'", '.')); console.log("1.234,567-" + " VS " + formatNumber("1.234,567-", ".", ',')); function formatNumber(sourceString, groupseperator, decimalSeperator) { let negativeNumber = false; var negRegexp = new RegExp("[-|)]$", "g"); var match = negRegexp.exec(sourceString); if (match && match.length > 0) { console.log(match[0]); negativeNumber = true; } //Step1:Replace braces space from the string sourceString = sourceString.replace(/[`\s-()'\]\\\/]/gi, ''); //Step2:Replace All Group Seperator with blank sourceString = sourceString.replace(new RegExp(`[${groupseperator}]`, 'g'), ''); //Step 3: Replace decimal seperator with.dot //Decimal Seperator will only replace from the last occurance sourceString = sourceString.replace(new RegExp(`${decimalSeperator}([^${decimalSeperator}]*)$`), '.$1'); if (negativeNumber) { sourceString = '-' + sourceString; } //console.log(sourceString); //console.log(Number(sourceString)); return Number(sourceString); }

If you refer code below scenario is failing.

console.log('-1,234.567' + ' VS '+ formatNumber('-1,234.567',',','.'));

It is returning it as positive number

negRegexp is wrong. It matches - at the end, but not the beginning.

Use separate alternatives in the regexp for each criteria.

 var negRegexp = /^-|-$|^\(.*\)$/; console.log(negRegexp.test('-123.55')); // Negative True console.log(negRegexp.test('123.55')); // Negative False console.log(negRegexp.test('(123.55)')); // Negative True console.log(negRegexp.test("1'234,567-")); // Negative True

The first alternative matches - at the beginning, the second matches - at the end, and the third matches ( at the beginning and ) at the end.

There's no need for the g flag since you're only matching one number.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM