2016-05-16 7 views
2

大文字小文字を除いて数値の検証をしています。私はキープレスイベントで検証を行っています。ユーザーが5桁の数字を入力した場合、その後はないですインテグラル= 5、小数= 3キープレスイベントの小数点以下の桁数確認

これは...

出力長の私の検証を行っていますどのようなプロセスである=積分+は

例を小数6桁目を入力することができます。 (すなわち、12345)。 しかし、「。」と入力するとその後、3小数点以下(すなわち、12345.678)にすることができます。これは完全に機能しています。

以下のケースで問題に直面しています。

ユーザーが1.234と入力すると、「。」の前にナビゲートします。矢印またはマウスのクリックを使用して配置すると、ユーザーは別の数字を入力できません。整数部分または小数部分のいずれかが長さに一致するかどうかをチェックするので、私はfalseを返す。

これを手伝ってもらえますか?キーアップイベントではできますが、キープレスイベントでのみこれを達成しようとしています。ユーザーが数字を入力する位置を取得する方法はありますか?はいの場合、1つの解決策を得ることができます。

var integral = 5, decimals = 3; 
//below code in the key press event 
if ([8, 9, 13, 37, 39,46].indexOf(e.keyCode) != -1) { 
    return true; 
} else if (e.keyCode == 190 && !e.shiftKey && decimals) { 
    _value = $(this).val(); 
    if (_value.indexOf('.') != -1) { 
     return false; 
    } 
    return true; 
} else if (48 >= e.keyCode || e.keyCode <= 57) { 
    _value = $(this).val(); 
    if (decimals) { 
     _value = _value.split('.'); 
     if (_value[0].length == integral || (_value[1] || '').length == decimals) { 
      return false; 
     } 
     return true; 
    } else { 
     if (_value.length == integral) { 
      return false; 
     } 
     return true; 
    } 
} 
return false; 
+0

現在のスクリプトを投稿できますか? – pppp

答えて

0

私は、ユーザーが数字を入力した場合の位置を取得するためselectionEndを使用。それを使って私はそれをしました。

var evt = e.target || e.srcElement; 
     _value = $(evt).val(); 
     if ([8, 9, 13, 37, 39, 46].indexOf(e.keyCode) != -1) { 
      return true; 
     } 
     else if (e.keyCode == 190 && !e.shiftKey && decimals) { 
      if (_value.indexOf('.') != -1) { 
       return false; 
      } 
      return true; 
     } 
     else if (48 >= e.keyCode || e.keyCode <= 57) { 
      if (decimals) { 
       var isHavingDot = false; 
       var dotPosition = ''; 
       if (_value.indexOf('.') != -1) { 
        isHavingDot = true; 
        dotPosition = _value.indexOf('.') 
       } 
       var length = _value.length; 
       if (isHavingDot) { 
        _value = _value.split('.'); 
        if (evt.selectionEnd <= dotPosition) { 
         if (_value[0].length >= integral) { 
          return false; 
         } 
        } 
        else if ((_value[1] || '').length >= decimals) { 
         return false; 
        } 
       } 
       else { 
        if (_value.length >= integral) { 
         return false; 
        } 
       } 
       return true; 
      } 
      else { 
       if (_value.length == integral) { 
        return false; 
       } 
       return true; 
      } 
     } 
     return false; 
+0

だから...私の答えのようなものselectionStartを使用して(彼らはkeypressイベントで同じです)。小数部の長さを切り捨てるだけなので、小数部の長さをテストする必要はありません。 – longestwayround

+0

@longestwayroundしかし、私は小数点以下をテストしなかった場合、ユーザーは小数点以下の任意の数を入れることができます...私の場合は小数点も重要です。 –

+0

答えを確認する - 実際にはより多くの小数を使用するユーザーを防ぎます。すべての検証はキー押下で行われるため、切り捨てによって小数点以下を追加できなくなります。 – longestwayround

0

すでにからkeyupイベントでそれを行う方法を知っている場合、あなたはそのコードを取ると、キー押下ハンドラに挿入することができ、あなた場合は、入力にあるであろう価値にそれを実装する必要があります値を渡します。 は、例えば、(私はあなたの検証は例のように動作しますと仮定)の場合:

$("#myinput").keypress(function (e) { 
    //first figure out what the value would be if the keypress were passed through 
    var key=(e.which) ? e.which : e.keyCode; 
    var inputvalue=String.fromCharCode((96 <= key && key <= 105)? key-48 : key) 
    var caretPos = document.getElementById("myinput").selectionStart; 
    var currentvalue=$("#myinput").val(); 
    var outputstring=currentvalue.substring(0, caretPos) + inputvalue + currentvalue.substring(caretPos); 

    //allow decimals through 
    if (outputstring===".") {  
      e.preventDefault();   
      $("#myinput").val("0."); 
      return false; 
    } 
    //cancel keypress if they string already has a decimal 
    if(key===46) return (outputstring.split(".").length - 1)>2;   

    //now perform the truncation and validation 
    e.preventDefault(); 
    var outputvalue=parseFloat(outputstring); 
    var decpart=Math.trunc((outputvalue- parseInt(outputvalue)) * 1000)/1000; 
    var intpart=Math.floor(outputvalue); 
    //perform your test on the output value here - only need to test the integer part, since the decimal part is truncated 
    var outputtest=String(intpart).length<=5; 
    if (outputtest){   
      //insert the value if it looks okay  
      $("#myinput").val(intpart+decpart);    
    } 
    return false; 
}); 
関連する問題