skip to Main Content

I am trying to verify that a string corresponds to this format "x.x" with x, a digit belonging to [0-9].

Right now, what I am doing is:

  • checking that the string is at least, and at most, made of 3 characters
  • checking that the string matches the regex [0-9.] (only digits and a dot)

So right now, I have:

      myString: Yup.string()
        .min(3, "Minimum 3 caractères: XXX.")
        .max(3, "Maximum 3 caractères: XXX.")
        .matches(/^[0-9]+$/, 'Doit contenir seulement des caractères numériques.')
        .nullable(),

Is there a way for me to:

  • check that myString[0] and myString[2] are digits
  • check that myString[1] is a dot

3

Answers


  1. What about just using the matches and pass a regex that validates the list of requirements in one go?

    const number = string().matches(/d{3,}.d{3,}/).nullable();
    
    number.validateSync("123.456") // pass
    number.validateSync("12.456") // fail min
    number.validateSync("123456") // fail no dot
    number.validateSync("1236.4566") // pass
    

    Here d{3,} matches a number with min 3 digits long followed by a dot . followed by another d{3,}.

    Login or Signup to reply.
  2. You can improve your code just using regex, like in your case:

    yup.string()
      .matches('^d{1}.d{1}$', 'Doit contenir seulement des caractères numériques.')
      .nullable()
    

    d validates whether first and last characters are digits with second character being a .

    Since you only need one number its d{1} before and after the dot.

    Edit:

    As @bobble bubble mentioned and after testing d{1} is actually redundant. In your case, the regex pattern is ^d.d$. You can use the above pattern if you want to increase the digit count.

    Login or Signup to reply.
  3. Another way is to use /^[0-9][.][0-9]$/, which I think is easier to read. Here is an example with tests:

    const regex= /^[0-9][.][0-9]$/;
    
    console.log(regex.test("4.3")); // true
    console.log(regex.test("9.0")); // true
    
    console.log(regex.test("91.0")); // false
    console.log(regex.test("4e3")); // false
    console.log(regex.test("abc")); // false

    With Yup, in your case, it would be:

    Yup.string()
      .matches(
        /^[0-9][.][0-9]$/,
        'It should be in the form of Digit + Period + Digit'
      )
      .nullable();
    

    Also, you can copy past the RegEx in regexr.com to get an explanation of each part of it.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search