2015-11-21 6 views
-1

Я хочу сделать регулярное выражение, которое поддерживает все ниже числа,Регулярное выражение в JavaScript, что доступ десятичные числа и только

  • Максимальная длина номера: 7
  • Максимальная длина знаков после запятой: 2

Пример:

  • Действительно: 500, 1234567, 350,75, 7500,05, 4500,3
  • Не действует: 100,123, 12345678, 45000,25

Я попытался с

<input type='number' pattern="/^\d{1,7}(\.\d{1,2})?$/"/>

, но его не удовлетворяющий значение длины макс.

Просьба помочь в решении этой проблемы.

+1

'/^(\ d {1,7} | \ d {1,5} \. \ D \ \ d {1,4} \. \ D {1,2}) $ /' –

+0

is 7 включать 2-х местные места или это 7 + 2? – webduvet

+2

"45000.25" не должно быть в действительных выборках? – Mat

ответ

1

Проверьте длину через lookahead.

   ↓    ↓  CHANGE THESE PARAMETERS 
/^(?=(.[.]?){1,7}$)\d*([.]\d{1,2})?$/ 
    |---------------|     LOOK-AHEAD TO CHECK LENGTH 
        |-|     INTEGER PORTION OF NUMBER 
         |-----------| OPTIONAL DECIMAL PORTION OF NUMBER 

Это более легко масштабируется к изменениям проблемы, такие как «до семи общих цифр с до четырех знаков после запятой», чем другие решения. Просто замените два символа, на которые указывает «ИЗМЕНИТЬ ЭТИ ПАРАМЕТРЫ».

+0

Принимает 5 целых чисел [например: 12345.78]. В этом случае длина стала 8. – Srinivas

+0

Мое понимание постановки проблемы состояло в том, что максимальная длина семи применяется к цифрам, а не к самой десятичной точке. Поэтому в этой интерпретации 12345.78 следует принять, потому что общее количество цифр равно 7. –

+0

Извините за это, но я упомянул '45000.25' это как «Нет действительного». Максимальное число 7 означает общую длину номера, включая '.' – Srinivas

0

Довольно уверен, что это будет делать это для тебя:

^(\d{1,5}\.\d{2}|\d{1,6}\.\d|\d{1,7})$ 

Все, что составляет 5,2 или 6,1 или 7 цифр (максимальное количество символов)

0

Вот jsbin для шаблона.

var re = /^(\d{1,7}|\d{1,6}\.\d|\d{1,5}\.\d{1,2})$/; 

function validate(str) { 
    return (str).match(re) !== null; 
} 

function assert(value, expected) { 
    return value === expected; 
} 

console.log(
    assert(validate("1234567"), true) 
); 

console.log(
    assert(validate("123456.7"), true) 
); 

console.log(
    assert(validate("12345.67"), true) 
); 

console.log(
    assert(validate("1234.567"), false) 
); 

console.log(
    assert(validate("12345.678"), false) 
); 

console.log(
    assert(validate("123456.78"), false) 
); 

console.log(
    assert(validate("1234567.8"), false) 
); 

console.log(
    assert(validate("12345678"), false) 
); 
+0

Можете ли вы расширить этот подход, чтобы обрабатывать случай с максимальными десятичными знаками 10 (с большей максимальной общей длиной, например 15)? –

+0

Нет, моя 're' не так масштабируема, как это печально. Я не знаком с вашим «взглядом вперед». Но я хочу быть. Я попробовал шаблон, как в моем [jsbin] (https://jsbin.com/xefiteh/edit?js, консоль), но второй и третий тесты не работают. Я не был уверен, как изменить выражение, чтобы исправить его. –

+0

Извините, я неправильно понял комментарий OPs, что * 7 включает десятичные знаки *, что означает, что была включена десятичная * точка *. Я обновил свой ответ. –

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