12

10進数の2桁後のキープレスを防ぐタスクがあります。私のjqueryファイルは

$(function(){ 
    $('#name').bind('paste', function(){
    var self = this;
    setTimeout(function() {
        if(!/^[a-zA-Z]+$/.test($(self).val()))
            $(self).val('');
    }, 0);    
           }); 

        $('#salary').bind('paste', function(){
    var self = this;
    setTimeout(function() {
        if(!/^\d*(\.\d{1,2})+$/.test($(self).val()))
            $(self).val('');
    }, 0);    
           }); 

    $('.decimal').keyup(function(){
        var val = $(this).val();
        if(isNaN(val)){
             val = val.replace(/[^0-9]./g,'');


             if(val.split('.').length>2) 
                 val =val.replace(/\.+$/,"");
        }
        $(this).val(val); 
    });
    });      

私のhtmlページは

<b>Name</b>
<input type="text" id="name"  /><br/>
<b>Salary</b>
<input type="text" id="salary"  class="decimal" />

ここでは、小数点以下 2 桁のみを書き込みたいのですが、どうすればよいですか? 私のコードはhttp://jsfiddle.net/V6s4B/で見ることができます

4

5 に答える 5

15

keyuponの前にキーイベントを処理できますkeypress。入力が好みに合わない場合は、イベントの発生を無効にすることができます。このようなもの:

アップデート

残念ながら、以下の私の元の回答は、浮動小数点数として正確に表現できない特定の数値では失敗します。'.'便利なヘルパー関数を使用して、文字列の長さと文字の位置をチェックする別のソリューションを次に示します。

jsフィドル

$('.decimal').keypress(function (e) {
    var character = String.fromCharCode(e.keyCode)
    var newValue = this.value + character;
    if (isNaN(newValue) || hasDecimalPlace(newValue, 3)) {
        e.preventDefault();
        return false;
    }
});

function hasDecimalPlace(value, x) {
    var pointIndex = value.indexOf('.');
    return  pointIndex >= 0 && pointIndex < value.length - x;
}

元の答え

jsフィドル

$('.decimal').keypress(function (e) {
    var character = String.fromCharCode(e.keyCode)
    var newValue = this.value + character;
    if (isNaN(newValue) || parseFloat(newValue) * 100 % 1 > 0) {
        e.preventDefault();
        return false;
    }
});

小数点以下 2 桁を超える数値が含まれているparseFloat(newValue) * 100 % 1 > 0場合は true と評価されることに注意してください。newValue

于 2013-03-28T11:34:23.563 に答える
4
$("#salary").keyup(function(){
    var number = ($(this).val().split('.'));
    if (number[1].length > 2)
    {
        var salary = parseFloat($("#salary").val());
        $("#salary").val( salary.toFixed(2));
    }
  });

http://jsfiddle.net/calder12/fSQpc/

手紙が箱に入るのを止めてください。2 つを一緒にしないといけません。時間がありません。

    if (this.value.match(/[^0-9]./g)) {
      this.value = this.value.replace(/[^0-9]./g, '');
      return false;
    }
于 2013-03-28T11:46:13.787 に答える
0

別の可能な解決策(デモ)

Number.prototype.toFixedDown = function(digits) {
  var n = this - Math.pow(10, -digits)/2;
  n += n / Math.pow(2, 53); // added 1360765523: 17.56.toFixedDown(2) === "17.56"
  return n.toFixed(digits);
}
$( function() {
    $('.two-digits').keyup(function(){
        if($(this).val().indexOf('.')!=-1){         
            if($(this).val().split(".")[1].length > 2){                
                if( isNaN( parseFloat( this.value ) ) ) return;
                this.value = parseFloat(this.value).toFixedDown(2);
            }  
         }            
         return this; //for chaining
    });
});
于 2013-03-28T12:10:06.507 に答える
0

これは一部の人にとっては役立つかもしれません。この男の答え、https: //stackoverflow.com/a/10514166/5382523 の @Tats_innit と上記の @Rick Calder を混ぜ合わせました。

"|| 0" の parseFloat については、https: //stackoverflow.com/a/17289322 の isJustMe からも編集します。入力のフィールドがnullまたはゼロの場合、「NaN」が表示され、削除できないためです。

HTML

<input type="text" name="txt_prod_price" id="txt_prod_price" class="form-control price" maxlength="20" placeholder="">

JAVASCRIPT (JQUERY)

$('.price').keypress(function(event) {

          if(event.which < 46 || event.which > 59) {
              event.preventDefault();
          } // prevent if not number/dot

          if(event.which == 46 && $(this).val().indexOf('.') != -1) {
              event.preventDefault();
          } // prevent if already dot

          var number = ($(this).val().split('.'));
          if (number[1].length > 2)
          {
           var price = parseFloat($("#txt_prod_price").val()) || 0;
           $("#txt_prod_price").val(price.toFixed(2));  
          }

      });

「価格」は事前に定義されています。

注:まだバグのある入力がありますが、まだキックしています。(y)

toFixed に関する詳細情報 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

于 2017-10-12T21:26:56.070 に答える
-1

私はこのようにしました:あなたの入力のためにクラスallow-only-numbersを提供しました:

  var numberOfDecimals = 2;
  $(document).on("input", ".allow-only-numbers", function () {
    var regExp = new RegExp('(\\.[\\d]{' + numberOfDecimals + '}).', 'g')    
    this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1').replace(regExp, '$1');
});
于 2018-08-25T02:12:04.030 に答える