0

好的,考虑到正则表达式不能正常工作并且没有错误,我将尝试使用金钱掩码。

目标仍然是只允许数字字符和小数。使用 maskMoney,它可以为您工作。

此外,我需要能够成功计算每个单元格。

截至目前,面具工作良好,但我不再能够计算。这就是我困扰的地方。

JQuery 和 JavaScript 代码:


<script type="text/javascript" language="javascript">
    $(document).ready(function(){
     $('.date').mask("99/99/9999");
     $('.account').mask("99-9-999999-9999");
     /*calcuating the vertical and horizontal inputs*/

     $('.R26').attr("disabled", "disabled");

 $('.calc').maskMoney({symbol: ""});
 $('.R25').unmaskMoney();
 $('.R18').unmaskMoney();

 $('input.description').focus(function(){
  if($(this).val()=="Enter text here"){
   $(this).val(" ");
  }

  else{
   $(this).val($(this).val());
  }
 });
 $('input.description').blur(function(){
  if($(this).val()==" "){
   $(this).val("Enter text here");
  }    
 });

$('.calc').keyup(function(){
 var classArray = $(this).attr('class').split(' ');
 //Personal gas expense
 $('.gasamount').sum("change", "#totals4");
 var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, "");
 $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val());
 $('.gasmoney').sum("change", "#totals5");
 //////////////////////

 //Sum of each cell
 $.each(classArray, function(){
  $('.'+this).sum("change", ".ttl"+this);
 });
 //Finding the grandtotal
 var grandTotal = $('.row26').parent().children('td:last').children('input');
 var sum = $('.row25').parent().children('td').children('.calc').sum();
 grandTotal.val(Number(sum).toFixed(2));
});

ColdFusion 和 HTML 代码:

#标签[r]#

<cfloop from="1" to="7" index="i">

 <td id="Day#i#" class="row#r# col#i#">
  <cfif r EQ 1>#Left(DayOfWeekAsString(i),3)#<cfelse><cfif r EQ 2>
  <input type="text" class="date-mask" /><cfelse>
  <input type="text" 
  <cfif labels[r] EQ "Personal Car: Mileage ##"> id="gasamount#i#" <cfelseif labels[r] EQ "Personal Car: Mileage $">id="gasmoney#i#" </cfif><cfif labels[r] EQ "Daily Totals">id="dailytotals#i#"</cfif>
   class="<cfif labels[r] EQ "Personal Car: Mileage ##">gasamount<cfelse><cfif labels[r] NEQ "Daily Totals">C#i#</cfif></cfif>
   <cfif labels[r] EQ "Personal Car: Mileage $">gasmoney<cfelse>calc R#r#</cfif>
   <cfif labels[r] EQ "Daily Totals">ttlC#i#</cfif>"
    <cfif labels[r] EQ "Daily Totals" OR labels[r] EQ "Personal Car: Mileage $">readonly="readonly"</cfif>
     /></cfif>
     </cfif>
 </td>


</cfloop>

 <td class="totals"><cfif r EQ 1>Total<cfelse><input type="text" id="totals" class="ttlR#r#" readonly="readonly" /></cfif></td>

我对同一个应用程序有类似的问题,但这实际上不是重复的(如果你认为它是。)。

'.'+this 是由数组创建的对象。我使用 cfloops 创建了一个大表,并添加了多个类。必须将多个类分解为一个数组,然后才能选择每个类作为自己的类。

4

5 回答 5

3

你很可能想要

.replace(/[A-Za-z$,-]/g, "")

代替

.replace(/[A-Za-z$-,]/g, "")

后一个表达式匹配:

  • A从 " " 到 " Z"的所有字符
  • a从 " " 到 " z"的所有字符
  • $从“ ”到“ ”的所有字符,(有这样的范围,但我不确定这是否是您的实际意图)

前一个表达式(注意移位的破折号)匹配:

  • A从 " " 到 " Z"的所有字符
  • a从 " " 到 " z"的所有字符
  • 字符“ $
  • 字符“ ,
  • 字符“ -

破折号在字符类中具有特殊含义,它定义了一个范围。如果要匹配文字破折号,请将其移动到字符类的末尾(或开头)。

编辑:除此之外,您似乎还想设置该值。通过val()将新值传递给函数来进行设置:

$dotThis = $('.' + this);
$dotThis.val($dotThis.val().replace(/[A-Za-z$-,]/g, ""));

这个说法:

$('.'+this).val().replace(/[A-Za-z$-,]/g, "");

创建一个替换的字符串并立即将其丢弃。

于 2009-08-04T14:14:43.510 回答
1

可能有点简单,但为什么不使用否定呢?Perl 语法:不确定 javascript。

为什么不:m/([^0-9]+)//g

零到九之间的匹配

于 2009-08-11T14:56:53.363 回答
0

编辑:我最初的答案是部分正确的,因为它改变了值,但它没有修复更严重的错误,我现在将解释。

我最初的修复导致每个单元格具有相同值的原因是因为 jQuery $ 方法返回与给定选择器匹配的每个元素。然而,调用 val() 只会得到第一个匹配元素的值,但通过调用 val(value) 设置值将设置每个匹配元素的值。

解决方案是在 each() 上方进行替换,这样只会清理单个元素 (the this)。如果您还想清理总计单元格,那么您可以each() 中执行此操作并".ttl" + this用作选择器而不是this.

$('.calc').keyup(function(){
    var classArray = $(this).attr('class').split(' ');

    //Sanitize out here, so we only affect one element.
    var singleCellVal = $(this).val()
    singleCellVal.replace(/[A-Za-z$-,]/g, "");
    $(this).val(singleCellVal);

    $.each(classArray, function(){
        var totalsum = $('.'+this).sum();
        $('.ttl'+this).val(Number(totalsum).toFixed(2));
    });

    //Finding the grandtotal
    var grandTotal = $('.row26').parent().
        children('td:last').children( 'input');
    var sum = $('.row25').parent().children( 'td').children('.calc').sum();
    grandTotal.val(Number(sum).toFixed(2));
});

你想要的是

var value = $('.'+this).val();
value.replace(/[A-Za-z$-,]/g, "");
$('.' + this).val(value);

字符类中的 $ 很好,正则表达式中的大多数元字符在字符类中并不特殊。但是,“ $-,”将匹配“介于”$和之间的任何字符,。我认为这是您想要的,但如果您只想匹配$,那么-您应该将该部分更改为“ $,-”(即/[A-Za-z$,-]/g)。-字符类末尾的A将匹配-, 其他任何地方都被视为一个范围,除非您对其进行转义 ( \-)。

于 2009-08-03T15:43:00.957 回答
0

行。所以我自己想通了。

使用 maskMoney(),我能够控制输入的字符并且仍然能够正确计算表格。

修复计算所需要做的就是揭开 .gasamount 的掩码:

                $('.gasamount').unmaskMoney();

这就是解决计算问题的原因。^^ 掩码导致总共 2 行出现问题,而这 2 行导致计算中断。


                $('.calc').maskMoney({symbol: ""});
                $('.R25').unmaskMoney();
                $('.R18').unmaskMoney();

            $('.calc').keyup(function(){
                var classArray = $(this).attr('class').split(' ');
                //Personal gas expense
                $('.gasamount').sum("change", "#totals4");
                var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, "");
                $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val());
                $('.gasmoney').sum("change", "#totals5");
                //////////////////////

                //Sum of each cell
                $.each(classArray, function(){
                    $('.'+this).sum("change", ".ttl"+this);
                });
                //Finding the grandtotal
                var grandTotal = $('.row26').parent().children('td:last').children('input');
                var sum = $('.row25').parent().children('td').children('.calc').sum();
                grandTotal.val(Number(sum).toFixed(2));
            });

每个试图提供帮助的人,感谢您抽出宝贵的时间!

如果有人想将此示例或代码用于未来的应用程序,请随时发表评论并让我知道,我可以设置一个包含示例、说明和源代码的不同页面。

于 2009-08-12T14:17:09.567 回答
-2

美元 ($) 用于标记正则表达式搜索的结束。/[A-Za-z$-,]/可能无法正常工作。使用反斜杠 ( ) 转义美元\$

于 2009-08-03T15:30:48.153 回答