Javascript中处理货币格式的总计计算(负)

Javascript中处理货币格式的总计计算(负),javascript,regex,Javascript,Regex,我目前在下面有一个javascript代码,在处理货币格式(如$500.00)时,它将总计计算到一个只读文本字段中。我遇到的问题是,当以货币格式(MinusSignNegative)输入多个负数(即($500.00)而不是-500.00)时,如何处理计算。我目前在总计中得到一个NaN错误 我相信这个正则表达式应该处理它,但我不知道如何实现 有人能提供解决方案吗 <SCRIPT LANGUAGE="JavaScript"> <!-- function to

我目前在下面有一个javascript代码,在处理货币格式(如$500.00)时,它将总计计算到一个只读文本字段中。我遇到的问题是,当以货币格式(MinusSignNegative)输入多个负数(即($500.00)而不是-500.00)时,如何处理计算。我目前在总计中得到一个NaN错误

我相信这个正则表达式应该处理它,但我不知道如何实现

有人能提供解决方案吗

    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function total(what,number) {
        var grandTotal = 0;
        for (var i=0;i<number;i++) {
           if (what.elements['price' + i].value.replace(/\$|\,/g,'') == '')
               what.elements['price' + i].value.replace(/\$|\,/g,'') == '0.00';
           grandTotal += (what.elements['price' + i].value.replace(/\$|\,/g,'') - 0);
        }
        what.grandTotal.value = (Math.round(grandTotal*100)/100);
        }
    //-->
    </SCRIPT>

    <FORM NAME="myName">
    Tax Due/Refund: <input TYPE="text" NAME="price0" VALUE="" SIZE="10" class='currency' onChange="total(this.form,3)"><BR>
    Interest: <input TYPE="text" NAME="price1" VALUE="" SIZE="10" class='currency' onChange="total(this.form,3)"><BR>
    Penalty: <input TYPE="text" NAME="price2" VALUE="" SIZE="10" class='currency' onChange="total(this.form,3)"><BR>
    Total Amount Assessed: <INPUT TYPE="TEXT" NAME="grandTotal" class='currency' SIZE="25" READONLY="readyonly" style="background:#eee none; color:#222; font-weight:bold">
    </FORM>

到期/退税:
兴趣:
惩罚:
分摊总额:
您可以使用或不使用该正则表达式

没有:

fieldValue = field.value; // "(500.00)"
// search for a "(" char
if (fieldValue.indexOf("(") >= 0) {
    // remove all chars, but numbers and dots
    fieldValue = fieldValue.replace(/[^0-9.]/ig, "");
    // 500.00
    numberFieldValue = Number(fieldValue) * -1;
}
与:

应该是这样的:

function total(what,number) {
    var grandTotal = 0;
    for (var i=0;i<number;i++) {

        fieldValue = what.elements['price' + i].value; // "(500.00)" 
        // search for a "(" char 
        if (fieldValue.indexOf("(") >= 0) { 
            // remove all chars, but numbers and dots 
            fieldValue = fieldValue.replace(/[^0-9.]/ig, ""); 
            // 500.00 
            numberFieldValue = Number(fieldValue) * -1; 
        } else if (fieldValue.replace(/\$|\,/g,'') == '') {
            numberFieldValue = 0;
        } else {
            numberFieldValue = number(fieldValue.replace(/\$|\,/g,''));
        }

        grandTotal += numberFieldValue ;
    }
    what.grandTotal.value = (Math.round(grandTotal*100)/100);
}
函数总数(什么,数字){
var-grandTotal=0;
对于(var i=0;i=0){
//除去所有字符,但不包括数字和点
fieldValue=fieldValue。替换(/[^0-9.]/ig,”);
// 500.00 
numberFieldValue=数字(fieldValue)*-1;
}else if(fieldValue.replace(/\$\\,/g',)=''){
numberFieldValue=0;
}否则{
numberFieldValue=number(fieldValue.replace(/\$\\,/g');
}
grandTotal+=numberFieldValue;
}
what.grandTotal.value=(数学四舍五入(grandTotal*100)/100);
}

如果您试图将负号从数字移到美元符号的左边, 在写入总值字段时执行此操作

function total(what, number){
    var grandTotal= 0,  i= number, val, sign;
    while(i){
        val= what.elements['price' + i--].value.replace([$, ]+/g,'') ;
        grandTotal+= parseFloat(val) || 0;
    }
    sign= grandTotal<0? '-' :'';
    what.grandTotal.value=  sign+'$'+ Math.abs(Math.round(grandTotal*100)/100);
}
函数总数(什么,数字){
var grandTotal=0,i=数字、val、符号;
而(i){
val=what.elements['price'+i--].value.replace([$,]+/g',);
grandTotal+=parseFloat(val)| 0;
}

sign=grandTotal感谢您的响应,但我如何将此解决方案应用到上面列出的函数total code中?您可以将此部分放入if子句上方的
for
循环中,更改
字段。value
for
what.elements['price'+I].value
并使用变量
fieldValue
而不是
what.elements['price'+i].value
在其他行上。请查看我对您的问题的编辑。代码应该是这样的吗?我仍然收到该代码的NaN错误。当我将值插入字段时,此代码给了我一个函数预期错误,并且未填充grandTotal。请使用您的代码进行编辑,以便我可以查看发生了什么。顺便说一句,您不需要编码。我说得对吗?他想对所有字段的值求和,但其中一些字段的格式是这样的,例如
($500.00)
function total(what, number){
    var grandTotal= 0,  i= number, val, sign;
    while(i){
        val= what.elements['price' + i--].value.replace([$, ]+/g,'') ;
        grandTotal+= parseFloat(val) || 0;
    }
    sign= grandTotal<0? '-' :'';
    what.grandTotal.value=  sign+'$'+ Math.abs(Math.round(grandTotal*100)/100);
}