質問

OK、正規表現が適切に機能せず、エラーがないことを考慮して、お金のマスクを試してみます。

目標は、数字と小数のみを許可することです。 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コード:

        #labels [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 <*>quot;>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 <*>quot;>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 <*>quot;>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>

   

同じアプリケーションで同様の質問がありましたが、これは実際には重複ではありません(あなたがそう思う場合)。

「。」+これは、配列によって作成されたオブジェクトです。 cfloopsを使用して大きなテーブルを作成し、複数のクラスを追加しました。複数のクラスを配列に分割し、各クラスを独自のものとして選択する必要がありました。

役に立ちましたか?

解決 4

わかりました。だから私は自分でそれを考え出した。

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));
            });

助けてくれた皆さん、お時間をいただきありがとうございます!

誰かがこの例またはコードを将来のアプリケーションに使用したい場合は、気軽にコメントしてお知らせください。例と手順とソースを含む別のページを設定できます。

他のヒント

あなたが望む可能性が高い

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

の代わりに
.replace(/[A-Za-z$-,]/g, "")

後者の表現は一致します:

  • &quot; A &quot;のすべての文字&quot; Z &quot;
  • &quot; a &quot;のすべての文字&quot; z &quot;
  • &quot; $ &quot;のすべての文字&quot; &quot; (そのような範囲がありますが、それがあなたの実際の意図かどうかはわかりません)

前の式(ダッシュがシフトされていることに注意)は一致します:

  • &quot; A &quot;のすべての文字&quot; Z &quot;
  • &quot; a &quot;のすべての文字&quot; z &quot;
  • 文字&quot; $ &quot;
  • 文字&quot; &quot;
  • 文字&quot; -&quot;

ダッシュは文字クラスで特別な意味を持ち、範囲を定義します。リテラルダッシュに一致させる場合は、文字クラスの末尾(または先頭)に移動します。

編集:それとは別に、値を設定したいようです。 val()を介して設定するには、新しい値を関数に渡します。

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

このステートメント:

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

置換された文字列を作成し、すぐに破棄します。

少し単純になりますが、否定を使用しないのはなぜですか? Perl構文:javascriptについてはわかりません。

理由: m /([^ 0-9] +)// g

0〜9の一致

編集:私の元の答えは値を変更したという点で部分的に正しかったが、今説明するより深刻なバグを修正しなかった。

元の修正によりすべてのセルに同じ値が設定される理由は、jQuery $メソッドが、指定されたセレクタに一致するすべての要素を返すためです。ただし、val()を呼び出すと、最初に一致した要素の値のみが取得されますが、val(value)を呼び出して値を設定すると、 every 一致した要素の値が設定されます。

解決策は、each()の上で置換を行うことです。これにより、単一の要素( this )のみがサニタイズされます。合計セルもサニタイズする場合は、each()で that を実行し、&quot; .ttl&quot;を使用します。 +セレクタとして 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);

文字クラスの$は問題ありません。正規表現のほとんどのメタ文字は、文字クラス内では特別ではありません。ただし、&quot; $-、&quot; 「間」にあるすべての文字と一致します。 $ および。これがあなたの望むものだと思いますが、 $ -のみを一致させたい場合は、その部分を&quot; < code> $、-&quot; (つまり、 / [A-Za-z $、-] / g )。文字クラスの最後にある--に一致します。エスケープしない限り、他の場所は範囲と見なされます( \-) 。

ドル($)は、正規表現検索の終了を示すために使用されます。 / [A-Za-z $-、] / はうまく機能しない可能性があります。バックスラッシュ( \ $ )でドルをエスケープします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top