maskMoney入力プラグインの使用—まだ助けが必要
-
11-07-2019 - |
質問
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 $-、] /
はうまく機能しない可能性があります。バックスラッシュ( \ $
)でドルをエスケープします。