2011-12-20 1 views
0

У меня есть текстовое поле формы, которое имеет событие KeyUp. В KeyUp я игнорирую все, кроме чисел, периода, обратного пространства, удаления и клавиш курсора. Итак, единственное, что может быть в поле, может быть числом или периодом.Подтверждение текстового поля, содержащего float, является допустимым значением в процентах?

Мне нужно проверить эти вещи (число станет% не более 100.00%): -Строка текстового поля является допустимым числом (которое всегда должно быть правдой, если только кто-то не вставил два «.»). -Строка текстового поля имеет максимум 2 знака после запятой -Если строка текстового поля имеет десятичную точку, у нее есть что-то после (1 или 2 десятичных знака, а не только период в конце) -Нет числа больше, чем 100 (< = 100)

примеры (то, что мне нужно проверить):

95 is true (valid, decimal places not required) 

95. is false (don't need a '.' with no decimal place after) 

95.0 is true 

95.00 is true 

95.000 is false (3 decimal places not valid) 100 is true 

101.01 is false (over 100) 

101 is false (over 100) 

Я видел некоторые вещи, которые делают несколько кусков этого списка, но я не достаточно умен, чтобы измените регулярное выражение, чтобы получить именно то, что мне нужно. Спасибо за любую помощь!

ответ

6

Некоторые люди предполагают регулярные выражения, но я думаю, что небольшая функция лучше подходит для такой проверки:

function validate(x) { 
    var parts = x.split("."); 
    if (typeof parts[1] == "string" && (parts[1].length == 0 || parts[1].length > 2)) 
     return false; 
    var n = parseFloat(x); 
    if (isNaN(n)) 
     return false; 
    if (n < 0 || n > 100) 
     return false; 

    return true; 
} 

console.log(validate("95")); 
console.log(validate("95.")); 
console.log(validate("95.0")); 
console.log(validate("95.00")); 
console.log(validate("95.000")); 
console.log(validate("101.01")); 
console.log(validate("101")); 

Live example

+0

Удивительный, очень ценится. Однако я обнаружил недостаток. Два периода возвращают true, например «90.1». вернет true. Возможно, я смогу выяснить. Я думаю, вы могли бы добавить еще один оператор if, проверяющий количество более одного периода (или что-то в этом роде). – Reno

+0

Да, это сделало бы это. –

+0

Играется и добавляет, что это последнее предложение if: if ((x.length - x.replace (/\./ g, "") .length)> 1) return false; – Reno

4

попробовать это выражение: 100% является частным случаем более общего шаблона

var re = /^((0|[1-9]\d?)(\.\d{1,2})?|100(\.00?)?)$/; 

объяснение

(0|[1-9]\d?) позволяет число от 0 до 99

(\.\d{1,2})? позволяет точку 1 или 2 цифры после

| в противном случае

100 принять 100

(\.00?)? с дополнительным 0 или 00

Edit:

Я попытался это jsfiddle демо http://jsfiddle.net/pCDVn/1/ и это работает ... смотреть на консоли

+0

Хорошая работа братан! можно ли принять 99,9 или 99,97 или любую десятичную точку? Пожалуйста посоветуй. благодаря! – mrrsb

0

Вы можете ограничить длина вашего поля до 5, проверьте, чтобы это значение можно было присвоить числу, а затем проверьте, что число от 0 до 100. Вы не сможете ввести 100.00, но зачем вам это нужно?

Также, here's скрипка для тестирования. Одно замечание, если вы действительно заботитесь о проверке «95». как false, вам придется добавить дополнительную проверку для этого. Однако я бы посоветовал это требование, поскольку он по-прежнему представляет действительный процент и не повлияет на результат расчетов.

Смежные вопросы