Estoy tratando de resolver el problema a continuación usando javascript, avíseme si alguien se encontró con un problema similar y cualquier puntero será realmente útil.
Estoy trabajando en el formato de moneda donde cada país puede tener una representación diferente para el formato de moneda negativo.
Requisito: si un número comienza/termina con , considere dicho valor como negativo. Del mismo modo, si un número comienza / termina con () , considere dicho valor como negativo.
-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); }Si hace referencia al código a continuación, el escenario está fallando.
console.log('-1,234.567' + 'VS '+ formatNumber('-1,234.567',',','.'));
Lo está devolviendo como número positivo.
negRegexp está mal. Coincide - al final, pero no al principio.
Use alternativas separadas en la expresión regular para cada criterio.
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 La primera alternativa coincide - al principio, la segunda coincide - al final, y la tercera coincide ( al principio y ) al final.
No hay necesidad de la bandera g ya que solo está acertando un número.