Chameron
Chameron

Reputation: 2984

PHP regex - valid float number

I want user only input 0-9 and only once "."

 patt = /[^0-9(.{1})]/

 1.2222 -> true
 1.2.2  -> false (only once '.')

help me , thank !

Upvotes: 22

Views: 33051

Answers (8)

Tanmay Chakrabarty
Tanmay Chakrabarty

Reputation: 64

I wrote the following regex that seems to work best for my test inputs so far,

/^-?(\d|[1-9]+\d*|\.\d+|0\.\d+|[1-9]+\d*\.\d+)$/

It matches integer using the first two alternatives

\d|[1-9]+\d*

Then it look for numbers like .5, .55, .05 etc., that is beginning with a .

\.\d+

Then it looks for the same as previous but a 0 before the .

0\.\d+

Then finally it looks for patterns integer and decimal parts, such as 5.5, 5.05 etc.

[1-9]+\d*\.\d+

You can test the regex in this link

Validate float - regex101

Upvotes: 2

Core Xii
Core Xii

Reputation: 6441

/^-?(?:\d+|\d*\.\d+)$/

This matches normal floats e.g. 3.14, shorthands for decimal part only e.g. .5 and integers e.g. 9 as well as negative numbers.

Upvotes: 26

Vantomex
Vantomex

Reputation: 2295

This regex:

\d*(?:\.\d+)?

will give results:

123 -> true
123.345 -> true
123. -> true
.345 -> true
0.3345 -> true

However, you must check emptiness of the input before using it because the regex also permit zero-length input.

Upvotes: 7

Gordon
Gordon

Reputation: 317177

Regular Expressions are for matching string patterns. If you are not explicitly after validating the input string's format (but the actual value), you can also use

filter_var("1.33", FILTER_VALIDATE_FLOAT);

to make sure the input can be used as a float value. This will return FALSE if it is not a float and the float or integer value otherwise. Any type juggling rules apply.

Upvotes: 9

user187291
user187291

Reputation: 53950

this is what you're looking for

$re = "~        #delimiter
    ^           # start of input
    -?          # minus, optional
    [0-9]+      # at least one digit
    (           # begin group
        \.      # a dot
        [0-9]+  # at least one digit
    )           # end of group
    ?           # group is optional
    $           # end of input
~xD";

this only accepts "123" or "123.456", not ".123" or "14e+15". If you need these forms as well, try is_numeric

Upvotes: 24

Hannes
Hannes

Reputation: 8237

Why not use http://php.net/manual/en/function.is-float.php ? But anyhow, the RegEx would be ^[\d]+(|\.[\d]+)$ have fun!

Upvotes: 1

AndiDog
AndiDog

Reputation: 70218

Why not just use is_numeric if you're not experienced with regular expressions.

As to your regex: . matches all characters, \. matches a dot. {1} is not necessary. And I have no clue what you're trying to do with [^ ... ]. Read the regular expressions tutorial if you really want to use regular expressions somewhere in your code.

Upvotes: 0

Pekka
Pekka

Reputation: 449743

You can use is_numeric() with the caveat that it accepts a bit more than one usually wants (e.g. 1e4).

Upvotes: 3

Related Questions