J'utilise ce javascript pour limiter les utilisateurs à ne taper que des nombres et un seul point comme séparateur décimal.
<script type="text/javascript">
function fun_AllowOnlyAmountAndDot(txt)
{
if(event.keyCode > 47 && event.keyCode < 58 || event.keyCode == 46)
{
var txtbx=document.getElementById(txt);
var amount = document.getElementById(txt).value;
var present=0;
var count=0;
if(amount.indexOf(".",present)||amount.indexOf(".",present+1));
{
// alert('0');
}
/*if(amount.length==2)
{
if(event.keyCode != 46)
return false;
}*/
do
{
present=amount.indexOf(".",present);
if(present!=-1)
{
count++;
present++;
}
}
while(present!=-1);
if(present==-1 && amount.length==0 && event.keyCode == 46)
{
event.keyCode=0;
//alert("Wrong position of decimal point not allowed !!");
return false;
}
if(count>=1 && event.keyCode == 46)
{
event.keyCode=0;
//alert("Only one decimal point is allowed !!");
return false;
}
if(count==1)
{
var lastdigits=amount.substring(amount.indexOf(".")+1,amount.length);
if(lastdigits.length>=2)
{
//alert("Two decimal places only allowed");
event.keyCode=0;
return false;
}
}
return true;
}
else
{
event.keyCode=0;
//alert("Only Numbers with dot allowed !!");
return false;
}
}
</script>
<td align="right">
<asp:TextBox ID="txtQ1gTarget" runat="server" Width="30px" CssClass="txtbx" MaxLength="6" onkeypress="return fun_AllowOnlyAmountAndDot(this);"></asp:TextBox>
</td>
Mais l'événement onkeypress (this) renvoie l'erreur requise d'objet dans cette fonction à cet endroit.
var amount = document.getElementById(txt).value;
Quelle est mon erreur ici?
Au lieu d'utiliser ceci:
onkeypress="return fun_AllowOnlyAmountAndDot(this);"
Vous devriez utiliser ceci:
onkeypress="return fun_AllowOnlyAmountAndDot(this.id);"
C'est un excellent endroit pour utiliser des expressions régulières.
En utilisant une expression régulière, vous pouvez remplacer tout ce code par une seule ligne.
Vous pouvez utiliser les regex_ suivants pour valider vos exigences:
[0-9]*\.?[0-9]*
En d'autres termes: zéro ou plusieurs caractères numériques, suivis de zéro ou une période, suivis de zéro ou de caractères numériques.
Vous pouvez remplacer votre code avec ceci:
function validate(s) {
var rgx = /^[0-9]*\.?[0-9]*$/;
return s.match(rgx);
}
Ce code peut remplacer votre fonction entière!
Notez que vous devez échapper à la période avec une barre oblique inverse (sinon, cela signifie "n'importe quel caractère").
Pour en savoir plus sur l'utilisation d'expressions régulières avec JavaScript, consultez cette page:
Vous pouvez également tester la regex ci-dessus ici:
Explication de l'expression régulière utilisée ci-dessus:
Les crochets signifient "n'importe quel caractère à l'intérieur de ces crochets". Vous pouvez utiliser un trait d'union (comme ci-dessus) pour indiquer une plage de caractères.
Le *
signifie "zéro ou plus de l'expression précédente.".
[0-9]*
signifie "zéro ou plusieurs chiffres"
La barre oblique inverse est utilisée comme caractère d'échappement pour la période, car le terme "période" signifie généralement "n'importe quel caractère.".
Le ?
signifie "zéro ou un des caractères précédents.".
Le ^
représente le début d'une chaîne.
Le $
représente la fin d'une chaîne.
Commencer la regex avec ^
et le terminer par $
garantit que la chaîne entière adhère au modèle de regex.
J'espère que cela t'aides!
Utilisez plutôt Jquery. Ajouter une classe décimale à votre zone de texte:
<input type="text" class="decimal" value="" />
Utilisez ce code dans votre JS. Il recherche plusieurs décimales et empêche également les utilisateurs de ne taper que des nombres.
$('.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);
});
Vérifiez ce violon: http://jsfiddle.net/2YW8g/
J'espère que ça aide.
function isNumberKey(evt,id)
{
try{
var charCode = (evt.which) ? evt.which : event.keyCode;
if(charCode==46){
var txt=document.getElementById(id).value;
if(!(txt.indexOf(".") > -1)){
return true;
}
}
if (charCode > 31 && (charCode < 48 || charCode > 57) )
return false;
return true;
}catch(w){
alert(w);
}
}
<html>
<head>
</head>
<body>
<INPUT id="txtChar" onkeypress="return isNumberKey(event,this.id)" type="text" name="txtChar">
</body>
</html>
Ajoutez simplement le code ci-dessous dans votre texte de saisie:
onkeypress='return event.charCode == 46 || (event.charCode >= 48 && event.charCode <= 57)'
<input type="text" class="decimal" value="" />
$('.decimal').keypress(function(evt){
return (/^[0-9]*\.?[0-9]*$/).test($(this).val()+evt.key);
});
Je pense que cette solution simple peut être.
Cela fonctionne mieux pour moi.
J'applique également un formateur de devise sur le flou où la partie décimale est arrondie à 2 chiffres, juste au cas où après avoir validé avec parseFloat.
Les fonctions qui obtiennent et définissent la position du curseur proviennent du blog de Vishal Monpara. Je fais aussi des choses intéressantes sur ces fonctions. Vous pouvez facilement supprimer 2 blocs de code où 2 décimales sont forcées si vous le souhaitez et vous débarrasser des fonctions set/get caret.
<html>
<body>
<input type="text" size="30" maxlength="30" onkeypress="return numericValidation(this,event);" />
<script language="JavaScript">
function numericValidation(obj,evt) {
var e = event || evt; // for trans-browser compatibility
var charCode = e.which || e.keyCode;
if (charCode == 46) { //one dot
if (obj.value.indexOf(".") > -1)
return false;
else {
//---if the dot is positioned in the middle give the user a surprise, remember: just 2 decimals allowed
var idx = doGetCaretPosition(obj);
var part1 = obj.value.substr(0,idx),
part2 = obj.value.substring(idx);
if (part2.length > 2) {
obj.value = part1 + "." + part2.substr(0,2);
setCaretPosition(obj, idx + 1);
return false;
}//---
//allow one dot if not cheating
return true;
}
}
else if (charCode > 31 && (charCode < 48 || charCode > 57)) { //just numbers
return false;
}
//---just 2 decimals stubborn!
var arr = obj.value.split(".") , pos = doGetCaretPosition(obj);
if (arr.length == 2 && pos > arr[0].length && arr[1].length == 2)
return false;
//---
//ok it's a number
return true;
}
function doGetCaretPosition (ctrl) {
var CaretPos = 0; // IE Support
if (document.selection) {
ctrl.focus ();
var Sel = document.selection.createRange ();
Sel.moveStart ('character', -ctrl.value.length);
CaretPos = Sel.text.length;
}
// Firefox support
else if (ctrl.selectionStart || ctrl.selectionStart == '0')
CaretPos = ctrl.selectionStart;
return (CaretPos);
}
function setCaretPosition(ctrl, pos){
if(ctrl.setSelectionRange)
{
ctrl.focus();
ctrl.setSelectionRange(pos,pos);
}
else if (ctrl.createTextRange) {
var range = ctrl.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
</script>
</body>
</html>
function isNumber(evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 46 || charCode > 57)) {
return false;
}
return true;
}
vous devriez utiliser cette fonction et écrire les propriétés de cet élément;
Code HTML:
<input id="deneme" data-mini="true" onKeyPress="return isNumber(event)" type="text"/>`
<script type="text/javascript">
function numericValidation(txtvalue) {
var e = event || evt; // for trans-browser compatibility
var charCode = e.which || e.keyCode;
if (!(document.getElementById(txtvalue.id).value))
{
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
else {
var val = document.getElementById(txtvalue.id).value;
if(charCode==46 || (charCode > 31 && (charCode > 47 && charCode < 58)) )
{
var points = 0;
points = val.indexOf(".", points);
if (points >= 1 && charCode == 46)
{
return false;
}
if (points == 1)
{
var lastdigits = val.substring(val.indexOf(".") + 1, val.length);
if (lastdigits.length >= 2)
{
alert("Two decimal places only allowed");
return false;
}
}
return true;
}
else {
alert("Only Numarics allowed");
return false;
}
}
}
</script>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtHDLLevel" MaxLength="6" runat="server" Width="33px" onkeypress="return numericValidation(this);" />
</div>
</form>
Essayez ceci pour plusieurs champs de texte (en utilisant le sélecteur de classe):
var checking = function(event){
var data = this.value;
if((event.charCode>= 48 && event.charCode <= 57) || event.charCode== 46 ||event.charCode == 0){
if(data.indexOf('.') > -1){
if(event.charCode== 46)
event.preventDefault();
}
}else
event.preventDefault();
};
function addListener(list){
for(var i=0;i<list.length;i++){
list[i].addEventListener('keypress',checking);
}
}
var classList = document.getElementsByClassName('number');
addListener(classList);
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<input type="text" class="number" value="" /><br><br>
<input type="text" class="number" value="" /><br><br>
<input type="text" class="number" value="" /><br><br>
<input type="text" class="number" value="" /><br><br>
</body>
</html>
essayez ce code
var check = function(evt){
var data = document.getElementById('num').value;
if((evt.charCode>= 48 && evt.charCode <= 57) || evt.charCode== 46 ||evt.charCode == 0){
if(data.indexOf('.') > -1){
if(evt.charCode== 46)
evt.preventDefault();
}
}else
evt.preventDefault();
};
document.getElementById('num').addEventListener('keypress',check);
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<input type="text" id="num" value="" />
</body>
</html>