3

I've got a Javascript function that tests a regexp that I'm intending to validate positive decimals up to a precision of two:

function isPositiveDecimalPrecisionTwo(str) {
    return /^\d*(\.\d{1,2}$)?/.test(str);
}

I'm not getting the results I'm expecting when I call it from code.

For example:

var a = isPositiveDecimalPrecisionTwo("1");         //   expect t, returns t
var b = isPositiveDecimalPrecisionTwo("1.2");       //   expect t, returns t
var c = isPositiveDecimalPrecisionTwo("1.25");      //   expect t, returns t
var d = isPositiveDecimalPrecisionTwo("1.257");     // * expect f, returns t *
var e = isPositiveDecimalPrecisionTwo("1.2575");    // * expect f, returns t *
var f = isPositiveDecimalPrecisionTwo(".25");       // * expect t, returns f *
var g = isPositiveDecimalPrecisionTwo("d");         //   expect f, returns f
var h = isPositiveDecimalPrecisionTwo("d1");        //   expect f, returns f
var i = isPositiveDecimalPrecisionTwo("1d");        // * expect f, returns t *
var j = isPositiveDecimalPrecisionTwo("1d1");       // * expect f, returns t *
var k = isPositiveDecimalPrecisionTwo("-1");        //   expect f, returns f
var l = isPositiveDecimalPrecisionTwo("-1.5");      //   expect f, returns f

There are three issues:

  1. Validating "1.257" or "1.2575" returns true, which I though would return false due to the \d{1,2}
  2. Validating ".25" returns false, which I thought would return true due to the ^\d*
  3. Validating "1d" or "1d1" return true. It looks like \. is reading as any character when it looks to me like it's a properly escaped "." (dot).

However, when I use a tool like regexpal.com, the same regexp appears to be validating the way I expect:

http://regexpal.com/?flags=g&regex=%5E%5Cd%2B(%5C.%5Cd%7B1%2C2%7D%24)%3F&input=

What am I missing?

2 Answers 2

7

The problem is that your $ is inside the parenthesis. You want it to be after the group.

/^\d*(\.\d{1,2})?$/

This should work the way you expect.

With the $ inside, it was matching everything that started with a number, since the end of string ($) was "optional".

Sign up to request clarification or add additional context in comments.

7 Comments

I want to +1, but there's something wrong here . . . the regex that the OP posted will actually match any string, whether or not it begins with a digit (because of the *). Your fix is right, your explanation is right, but something is just missing.
@ruakh: The OP's original regex will not match -1. The regex will match 0 numbers, and then 0 of the group, so it will match "nothing".
Re: second sentence: Right, but regexes are allowed to match "nothing". All of his examples return true, at least in Firefox.
Unless I'm missing something, it looks like RegexPal doesn't actually give any indication of whether a regex matches, only of what it matches; so when the regex matches "nothing", you don't see it.
@ruakh: You're right about RegexPal. I'll keep that in mind in the future.
|
2

You can also do it without grouping the decimal portion by just adding a ? after the escaped decimal point

^\d*\.?\d{1,2}$

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.