cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
eliotcole
Super User
Super User

How To Define If Something Is / Isn't A Number or Integer

So you need to know if a value inside a function or expression (or anywhere!) is a number or an integer? Well join the club.

 

Flow/Power Automate has long needed something like this, but it just hasn't reared its head properly. There is a provision in the Azure Logic Functions for an isInt() function, which is part of the list of functions linked from Power Automate. This should define specifically if a value is an integer. However it doesn't quite work over here. I've raised this as a bug.

 

However, none of this should stop anyone from defining whether or not a value is a number/integer or not. 

 

Maybe you're planning on using a value to fill an integer variable, or field, somewhere, and want to ensure entries are corrected en route. Perhaps you are in the middle of a long expression, and part of it relies on knowing if a value is a number or integer outside of the conventional flow logic.

 

There are some ways of accomplishing some of this using error management (here's an example of handling errors - but not in relation to this issue), but that doesn't help with expressions that need it.

 

Finally ... maybe if you're super clever ... I have a feeling that with this you can use it to put logic gates into expressions, too.

 

I'm placing this here because I don't upload flows, sorry.

1 ACCEPTED SOLUTION

Accepted Solutions
eliotcole
Super User
Super User

Numbers

The below expression will basically return a true value if the value that you pass through in ENTER_SOURCE is a number of any kind (including floating points).

not(equals(string(xpath(xml(json(concat('{"value":"', ENTER_SOURCE, '"}'))), 'number(*/text())')), 'NaN'))

To explain what's happening here, I will work from the inside, out:

  1. concat() - This string concat('{value:"', ENTER_SOURCE, '"}') puts your value within a basic JSON object stucture, defining the value field as your input value.
  2. json() - This converts that object structure made previously into a true JSON object.
  3. xml() - This now converts the json object into an xml object.
  4. xpath(XML, 'number(*/text())') - This passes an xpath command, I'm not fully clued in on these, but I believe it's attempting to convert a string to a number. If it fails to do so, due to an invalid character (say a colon), then it will report "NaN", which means "Not a Number" and tells you your value is not a valid number of any kind.
  5. string() - This converts the result of the xpath() command into a string so that you can compare any error.
  6. equals(STRING,'NaN') - This checks to see if the string produced by the xpath() command is equal to "NaN" if so it will return a 'true' value saying it is NOT a number.
  7. not() - Since we need to know if it IS a number, we will need to reverse that equals() result to find out if our original, which this does.

That does make it seem a lot more complicated than it is, though. Essentially, you make a JSON object with your value inside a field, convert that to XML, use XPATH to check if it's a number, and pass out a true/false value.

If you want to be extra careful, you can wrap your initial value in a trim() function, too, which will ensure there's no leading or following spaces on it.

 

Integers

One might point out that if the number ends with ".", or any number of zeros ".00", then (especially in javascript, which is relevant to these functions) the number is technically an integer. The logic for that is a little more onerous, but more useful in flows due to the amount of values that need to be an integer.

The logic may be longer, but it can still be done all in one expression or within a larger expression to get something else:
if(
    not(
        equals(
            string(xpath(xml(json(concat('{value:"', ENTER_SOURCE, '"}'))), 'number(*/text())')), 
            'NaN')
        ), 
    if(
        and(
            contains(string(ENTER_SOURCE), '.'), 
            or(
                endsWith(string(ENTER_SOURCE), '.'), 
                equals(
                    int(last(split(string(ENTER_SOURCE), '.'))), 
                    0
                )
            )
        ),
        true,
        not(
            contains(
                string(ENTER_SOURCE), 
                '.'
            )
        )
    ), 
    false
)

That's all she wrote.

View solution in original post

2 REPLIES 2
eliotcole
Super User
Super User

Numbers

The below expression will basically return a true value if the value that you pass through in ENTER_SOURCE is a number of any kind (including floating points).

not(equals(string(xpath(xml(json(concat('{"value":"', ENTER_SOURCE, '"}'))), 'number(*/text())')), 'NaN'))

To explain what's happening here, I will work from the inside, out:

  1. concat() - This string concat('{value:"', ENTER_SOURCE, '"}') puts your value within a basic JSON object stucture, defining the value field as your input value.
  2. json() - This converts that object structure made previously into a true JSON object.
  3. xml() - This now converts the json object into an xml object.
  4. xpath(XML, 'number(*/text())') - This passes an xpath command, I'm not fully clued in on these, but I believe it's attempting to convert a string to a number. If it fails to do so, due to an invalid character (say a colon), then it will report "NaN", which means "Not a Number" and tells you your value is not a valid number of any kind.
  5. string() - This converts the result of the xpath() command into a string so that you can compare any error.
  6. equals(STRING,'NaN') - This checks to see if the string produced by the xpath() command is equal to "NaN" if so it will return a 'true' value saying it is NOT a number.
  7. not() - Since we need to know if it IS a number, we will need to reverse that equals() result to find out if our original, which this does.

That does make it seem a lot more complicated than it is, though. Essentially, you make a JSON object with your value inside a field, convert that to XML, use XPATH to check if it's a number, and pass out a true/false value.

If you want to be extra careful, you can wrap your initial value in a trim() function, too, which will ensure there's no leading or following spaces on it.

 

Integers

One might point out that if the number ends with ".", or any number of zeros ".00", then (especially in javascript, which is relevant to these functions) the number is technically an integer. The logic for that is a little more onerous, but more useful in flows due to the amount of values that need to be an integer.

The logic may be longer, but it can still be done all in one expression or within a larger expression to get something else:
if(
    not(
        equals(
            string(xpath(xml(json(concat('{value:"', ENTER_SOURCE, '"}'))), 'number(*/text())')), 
            'NaN')
        ), 
    if(
        and(
            contains(string(ENTER_SOURCE), '.'), 
            or(
                endsWith(string(ENTER_SOURCE), '.'), 
                equals(
                    int(last(split(string(ENTER_SOURCE), '.'))), 
                    0
                )
            )
        ),
        true,
        not(
            contains(
                string(ENTER_SOURCE), 
                '.'
            )
        )
    ), 
    false
)

That's all she wrote.

eliotcole
Super User
Super User

For whatever reason editing either of the previous posts is proving problematic, so apologies if this looks like a bump, it most certainly is *not*. 🙂

I've realised that step 2 is pointless, but it does help you understand some of the structures you'll see elsewhere. You'll be fine with this:

xml(concat('<N>',ENTER_SOURCE, '</N>'))​

Helpful resources

Announcements
Power Platform Conf 2022 768x460.jpg

Join us for Microsoft Power Platform Conference

The first Microsoft-sponsored Power Platform Conference is coming in September. 100+ speakers, 150+ sessions, and what's new and next for Power Platform.

May UG Leader Call Carousel 768x460.png

June User Group Leader Call

Join us on June 28 for our monthly User Group leader call!

MPA Virtual Workshop Carousel 768x460.png

Register for a Free Workshop

Learn to digitize and optimize business processes and connect all your applications to share data in real time.

Power Automate Designer Feedback_carousel.jpg

Help make Flow Design easier

Are you new to designing flows? What is your biggest struggle with Power Automate Designer? Help us make it more user friendly!

Top Solution Authors
Top Kudoed Authors
Users online (2,909)