2015-05-03 1 views
2

Я пытаюсь проверить действительное число с плавающей точкой. В основном я хочу, чтобы принять числа до четырех цифр после точки или запятой:Reguralexpresion, который принимает действительные числа с плавающей запятой [PHP]

0,2342 
123412,2300 
1234.0000 
1244 
1234,12 
1234.12 
0.23 

Я также хочу, чтобы отклонить числа с ведущими нулями, но передать 0, если он сам по себе перед точкой или запятой.

,1234 
00012.2342 
01,1234 

Я использовал это выражение, но это не работает, как я ожидал:

$number_exp = "<^[0]?([^0][0-9]+)?[.|,]?[0-9]{0,4}$>"; 
$test = '0123,4342'; 

if(preg_match($number_exp, $test)) return true; 
return false; 

Кто знает, как кондиционировать Постулаты так он будет принимать значение 0, если и только если он сам по себе до того, как ограничитель?

ответ

2

Все, что нужно играть с захватом группировки Вы можете использовать следующее регулярное выражение:

^(([1-9]+|0|[1-9]+?0)([.,][0-9]{0,4})?)$ 

Demo

Также отметим, что [^0] неправильное регулярное выражение, потому что это будет соответствовать все, кроме 0 так будет совпадающие символы или ...

+0

ну это по какой-то причине будет принимать $ тест = '023,4342'; – DevWL

+1

@GlupiJas Нет, он не видит демонстрацию https://regex101.com/r/hA7nH0/3 – Kasramvd

+0

Он работает после вашего редактирования thx – DevWL

0

Уже найдено решение

$number_exp = "<^([^0][1-9]+)?([0]{1})?[.|,]?[0-9]{0,4}$>"; 

Но все еще интересно, есть ли другой способ сделать это?

1

Как насчет:

/^(?:[1-9]\d*|0)(?:[,.]\d[0,4})?$/ 

Объяснение:

/     : regex delimiter 
^     : begining of string 
    (?:    : start non capture group 
     [1-9]  : one digit from 1 to 9 
     \d*   : any number of digits from 0 to 9 
     |   : OR 
     0   : zero 
    )    : end of group 
    (?:    : start non capture group 
     [,.]  : a comma or a dot 
     \d[0,4}  : 0 to 4 digits 
    )?    : end of group, optional 
$     : end of string 
/     : regex delimiter 
Смежные вопросы