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
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
CodePudding user response:
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.