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
October Events

Mark Your Calendars

So many events happening this month - don't miss out!

 WHAT’S NEXT AT MICROSOFT IGNITE 2022

WHAT’S NEXT AT MICROSOFT IGNITE 2022

Explore the latest innovations, learn from product experts and partners, level up your skillset, and create connections from around the world.

Register for a Free Workshop.png

Register for a Free Workshop

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

Users online (4,250)