2011-12-21 2 views
0

Я использую следующий код, чтобы проверить, если значение в текстовом поле числовое:Проверить длину значения, и если это числовое

(function ($) { 
    $.fn.numeric = function (options) { 
     return this.each(function() { 
      var $this = $(this); 

      $this.keypress(options, function (e) { 
       // allow backspace and delete 
       if (e.which == 8 || e.which == 0) 
        return true; 

       //if the letter is not digit 
       if (e.which < 48 || e.which > 57) 
        return false; 

       // check max range 
       var dest = e.which - 48; 
       var result = this.value + dest.toString(); 
       if (result > e.data.max) { 
        return false; 
       } 
      }); 
     }); 
    }; 
})(jQuery); 

При использовании на элементе ввода текстового поля, я объявляю его следующим образом

$(input).numeric({ max: 999}); 

Проблема в том, что он работает над вводом и проверяет, что значение должно быть целым, а не строковым.

Но мне нужно изменить код, который будет проверять как двойной.

Так что если я вставлю 0.22, все будет в порядке, но если я вложу .22 , он не заполнит номер.

Пожалуйста, помогите

ответ

1

Этот код должен работать так, как вы ожидали:

(function($) { 
    $.fn.numeric = function(options) { 
     return this.each(function() { 
      var $this = $(this); 

      $this.keypress(options, function(e) { 
       // allow backspace and delete 
       if (e.which == 8 || e.which == 0) { 
        return true; 
       } 

       // allow float 
       if (e.which == 46 && this.value.length >=1 && this.value.indexOf('.') == -1) { 
        return true; 
       } 

       //if the letter is not digit 
       if (e.which < 48 || e.which > 57) return false; 

       // check max range 
       var dest = e.which - 48; 
       var result = this.value + dest.toString(); 
       if (result > e.data.max) { 
        return false; 
       } 
      }); 
     }); 
    }; 
})(jQuery); 

демо: http://jsfiddle.net/GuillaumeCisco/nGNxG/

1

Проверьте этот ответ и комментарии (в частности, принятый один): Validate decimal numbers in JavaScript - IsNumeric()

В противном случае, это действительно необходимо, чтобы проверить значение на каждом нажатии клавиши?

0

Я пробовал отлаживать код. Вам потребуется только обновление для «.». Значение ASCII '.' (точка) равна 46. Если вы сделаете ниже изменения, это сработает!

  1. Update (e.which == 8 || e.which == 0) с (e.which == 8 || e.which == 0||e.which==46)
  2. Вы требуете, чтобы обернуть ввод с котировками - $('input').numeric({ max: 999});
  3. теста, предупреждая значение с кодом alert(parseInt($('input').val()));

Я видел выше изменений решает эту проблему :) Пожалуйста, , Дайте мне знать, если это не сработает :)

+0

Это лучше. Но у сценария есть несколько проблем –

+0

Основная проблема, которая имеет значение .22, разрешена, но не должна –

+0

Спасибо вам за помощь –

0

Это может быть обременительным для проверки на каждом keypress случае, и только что вернулся от ложного нажатия клавиши не позволяет пользователю понять, почему они не могут ввести, что ключ. Вероятно, у вас есть поле, помеченное как числовое в ярлыке или что-то в этом роде, но любая дополнительная помощь, которую вы можете дать пользователю, даже если пользователь только вы, может сэкономить много неприятностей по дороге. Как насчет чего-то подобного?

(function($) { 
    $.fn.numeric = function(options) { 
     return this.each(function() { 
      var $this = $(this); 

      $this.blur(function(e) { 
       if (isNaN(+this.value)) { 
        $('<span class="error">Must be numeric</span>').insertAfter($this); 
       } else { 
        $this.next('span.error').remove(); 
       } 
      }); 
     }); 
    }; 
}(jQuery)); 

Существует working example here.

Кроме того, вам нужно будет добавить свою минимальную/максимальную проверку из параметров. Я удалил это ради этого примера.

И, наконец, если вы собираетесь делать много проверок, вы можете использовать библиотеку проверки, например jQuery Validation, вместо того, чтобы кататься самостоятельно.

0

Я следовал за решением, предложенным @Guillaume.Но я добавил дополнительное условие

if (this.value.length > e.data.maxLength) 
      return false; 

Таким образом, весь код ниже

(function ($) { 

    $.fn.numeric = function (options) { 

     return this.each(function() { 
      var $this = $(this); 

      $this.keypress(options, function (e) { 

       // allow backspace and delete 
       if (e.which == 8 || e.which == 0) 
        return true; 

       if (e.which == 46 && this.value.length >= 1 && this.value.indexOf('.') == -1) { 
        return true; 
       } 
       //if the letter is not digit 
       if (e.which < 48 || e.which > 57) 
        return false; 

       // check max range 
       var dest = e.which - 48; 
       var result = this.value + dest.toString(); 
       if (result > e.data.max) { 
        return false; 
       } 

       if (this.value.length > e.data.maxLength) 
        return false; 
      }); 
     }); 
    }; 
})(jQuery); 

И использовать его

$(input).numeric({ max: 999,maxLength:4}); 

MAXLENGTH - свойство указывает максимальную длину входного