regex
しばらくゲームから離れていました。ユーザーがドル記号を付けて/付けずに、またはコンマを付けて/付けずに金額を入力できるようにする方法を考え出そうとしています。たとえば、次の値はすべて有効である必要があります。
5
5.1
5.10
$5
500,000
500,000.1
500,000.10
$100,000,000.50
etc....
誰か助けてくれませんか?
regex
しばらくゲームから離れていました。ユーザーがドル記号を付けて/付けずに、またはコンマを付けて/付けずに金額を入力できるようにする方法を考え出そうとしています。たとえば、次の値はすべて有効である必要があります。
5
5.1
5.10
$5
500,000
500,000.1
500,000.10
$100,000,000.50
etc....
誰か助けてくれませんか?
これはうまくいくはずです:
isValid = str.search(/^\$?[\d,]+(\.\d*)?$/) >= 0;
カンマの配置をもう少し厳密にします (たとえば、3,2.10 は拒否されます):
isValid = str.search(/^\$?\d+(,\d{3})*(\.\d*)?$/) >= 0;
そこから数値を取得するには:
if(isValid) {
var num = Number(str.replace(/[\$,]/g, ''));
...
}
Qunit フレームワークを使用したこの 1 つは、テスト駆動開発 (TDD) ではありません。
TDD の概要http://net.tutsplus.com/tutorials/javascript-ajax/test-driven-javascript-development-in-practice/
1つ目: テストを書く。
2 番目: 監視テストが失敗します。
3: テストに合格する。
4: リファクタリング。
var moneyTest_RE = /^\$?\d+((,\d{3})+)?(\.\d+)?$/;
test("test money format for valid values", function () {
var moneyArr = ["5","5.1","5.10","$5","500,000","500,000.1","500,000.10","$100,000,000.50", "500,000,100" ];
var i = moneyArr.length;
while( i-- ){
equal( moneyTest_RE.test( moneyArr[ i ] ), true, moneyArr[ i ] + " didn't match completely." );
}
});
test("test money format for invalid values", function () {
var moneyArr = ["5..","$$5.1",".5.10","$5.2.","50,0,000",",500,000.1","500,000,10,","$1,00,000,000.50", "500,000,10"];
var i = moneyArr.length;
while( i-- ){
equal( moneyTest_RE.test( moneyArr[ i ] ), false, moneyArr[ i ] + " didn't match completely." );
}
});
これがあなたの問題に対する1つの可能な解決策です。
var moneyTest_RE = /^\$?\d+((,\d{3})+)?(\.\d+)?$/;
デモはこちら: http://jsfiddle.net/vpyV6/
私はリファクタリングするのを忘れていました。
^(\$?\d{1,3}(?:,?\d{3})*(?:\.\d{2})?|\.\d{2})?$
これにはしばらく時間がかかりましたが、ついに完全に機能するものを手に入れました。100.00、.35、$1.35 などのケースが考慮されます。コンマの位置が間違っているエントリ、コンマの間または前の数字が多すぎるエントリ、または小数点の後の数字が多すぎるエントリを除外します。
ここでそれをいじることができます
おそらくこれ? http://refiddle.com/2tg
(\$?(:?\d+,?.?)+)
また、http://refiddle.com/2ti ; 123,45.4.3のような数字と一致しない長いバージョン
^(\$?(:?\d+,?)+(?:.?\d+)?)$