Would appreciate any suggestion on how to format numbers in the emails that Flow generates.
I've got a Flow that generates an email requesting approval triggered by a button in PowerApps.
The body of the email references a couple of numbers from a Sharepoint list.
In the Sharepoint list these numbers are formatted as currency, for example $150,200.
In the email that Flow generates these numbers show without the currency symbol and without the thousands separator. So, for example: 150200.
I can easily add the currency symbol in but can't seem to get the thousands separator back in.
Any suggestions on how to accomplish this? Thanks.
Please use formatNumber now instead of that insane function posted earlier. A locale-specific solution with commas and rounding is easy.
formatNumber(1234.567, 'N', 'en-US')
https://flow.microsoft.com/en-us/blog/simplified-number-formatting/
I simulated your input using Compose to get a functional solution you can copy-paste directly.
The result of that "concat(...)" is your string-to-float-to-rounded-number-to-currency-string value.
Here's the formula:
concat(if(greaterOrEquals(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000),1000000000),concat(substring(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 9))),',',substring(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)),max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 9)),min(3, length(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000))))),',',substring(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)),max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 6)),min(3, length(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000))))),',',substring(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')))))),if(greaterOrEquals(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000),1000000),concat(substring(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 6))),',',substring(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)),max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 6)),min(3, length(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000))))),',',substring(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')))))),if(greaterOrEquals(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000),1000),concat(substring(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 3))),',',substring(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')))))),first(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))))),'.',if(contains(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'),concat(last(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.')),if(less(length(last(split(string(div(add(mul(float(item()['Quote_x0020_Amount']),1000),sub(if(greaterOrEquals(mod(mul(float(item()['Quote_x0020_Amount']),1000),10),5),10,0),mod(mul(float(item()['Quote_x0020_Amount']),1000),10))),1000)), '.'))), 2),'0','')),'00'))
And the result:
Although I used a variable in my originally-posted example as a generic way to represent unknown input, it is not a requirement of the formula. In your case you should not use a variable because it ruins your ability to use concurrency. You should only use variables inside a loop if you are aggregating values (and you don't require the aggregation to be strictly sequential).
In case you're unfamiliar with it, here's how you can multi-thread your loop!
Also, you don't need to use an action to hold the formatted value (unless you plan to use it multiple times in your loop, then it is probably a good idea). You can put that "concat(...)" expression wherever your Flow needs it inside the loop.
Hi @degvalentine ,
Thanks for getting back to me.
In my specific case, I have a "set quote amount to string" variable being set in an "apply to each" as you can see below.
I tried replacing what you said before in the formula, but it did not work. Any ideas?
Thanks so much! Really appreciate the help.
Hi @jamiehandelman ,
If you have a string input, then you'll need to replace the "variables('myFloat')" in my example with "float({your-string-src})". E.g. if you're in an Apply-to-each with the string to be formatted in the "dollarStr" property, then you should replace "variables('myFloat')" with "float(item()['dollarStr'])".
If you'd like some specific solution, send some details of your use case, e.g. screenshots. Glad to help.
Hi there,
Thanks for this great explanation.
Do you know what the formula would look like if I wanted to set my variable as a string, rather than a float? I am having a hard time figuring it out.
Thanks!
Credit to @Mattw112IG who reported a bug, where the code didn't check for values of length under 3.
I blame Flow's insane dedication to declarative processing of "if()" statements (i.e. evaluating BOTH the true/false parts before returning one).
Here's the corrected version:
concat( if( greaterOrEquals( variables('myFloat'), 1000000000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 9)) ), ',', substring( string(variables('myFloat')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 9)), min(3, length(string(variables('myFloat')))) ), ',', substring( string(variables('myFloat')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 6)), min(3, length(string(variables('myFloat')))) ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), if( greaterOrEquals( variables('myFloat'), 1000000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 6)) ), ',', substring( string(variables('myFloat')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 6)), min(3, length(string(variables('myFloat')))) ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), if( greaterOrEquals( variables('myFloat'), 1000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)) ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), first(split(string(variables('myFloat')), '.')) ) ) ), '.', if( contains(string(variables('myFloat')), '.'), concat( last(split(string(variables('myFloat')), '.')), if( less(length(last(split(string(variables('myFloat')), '.'))), 2), '0', '' ) ), '00' ) )
And the corrected version with number rounding, all inlined:
concat(if(greaterOrEquals(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000),1000000000),concat(substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 9))),',',substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 9)),min(3, length(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000))))),',',substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 6)),min(3, length(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000))))),',',substring(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')))))),if(greaterOrEquals(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000),1000000),concat(substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 6))),',',substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 6)),min(3, length(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000))))),',',substring(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')))))),if(greaterOrEquals(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000),1000),concat(substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 3))),',',substring(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')))))),first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))))),'.',if(contains(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'),concat(last(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.')),if(less(length(last(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)), '.'))), 2),'0','')),'00'))
And the proof:
awesome, thanks
Edit: Flow has added the formatNumber function since this original post. Use this instead:
formatNumber(variables('myFloat), 'N', 'en-US')
Same process, expanded for values under 1 trillion.
concat( if( greaterOrEquals( variables('myFloat'), 1000000000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 9)) ), ',', substring( string(variables('myFloat')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 9)), 3 ), ',', substring( string(variables('myFloat')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 6)), 3 ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), if( greaterOrEquals( variables('myFloat'), 1000000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 6)) ), ',', substring( string(variables('myFloat')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 6)), 3 ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), if( greaterOrEquals( variables('myFloat'), 1000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)) ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), first(split(string(variables('myFloat')), '.')) ) ) ), '.', if( contains(string(variables('myFloat')), '.'), concat( last(split(string(variables('myFloat')), '.')), if( less(length(last(split(string(variables('myFloat')), '.'))), 2), '0', '' ) ), '00' ) )
And all in one line with the fraction rounded to 2 digits:
concat(if(greaterOrEquals(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000),1000000000),concat(substring(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 9))),',',substring(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 9)),3),',',substring(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 6)),3),',',substring(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')))))),if(greaterOrEquals(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000),1000000),concat(substring(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 6))),',',substring(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 6)),3),',',substring(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')))))),if(greaterOrEquals(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000),1000),concat(substring(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)),0,max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 3))),',',substring(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')),max(0, sub(length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 3)),min(3, length(first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')))))),first(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))))),'.',if(contains(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'),concat(last(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.')),if(less(length(last(split(string(div(add(mul(variables('myFloat'), 1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'), 1000), 10),5),10,0),mod(mul(variables('myFloat'), 1000), 10))),1000)), '.'))), 2),'0','')),'00'))
If you need to format values over 1 trillion, I believe the correct formatting for national debt is simply 😱.
Amazing kindness being displayed here. Thanks for sharing. I do agree, MS needs an equivalent action for "numbers" as they have for "dates/time" conversion.
Here's an expression to format a float less than 1 million into a string for currency (not including the dollar symbol) with a thousands separator and 2 digits after the decimal.
123.4 => "123.40" 1234 => "1,234.00" 1234.05 => "1,234.05"
0.1 => "0.10"
Uses variables('myFloat') to represent the number you want to format for currency.
concat( if( greaterOrEquals( variables('myFloat'), 1000 ), concat( substring( string(variables('myFloat')), 0, max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)) ), ',', substring( first(split(string(variables('myFloat')), '.')), max(0, sub(length(first(split(string(variables('myFloat')), '.'))), 3)), min(3, length(first(split(string(variables('myFloat')), '.')))) ) ), first(split(string(variables('myFloat')), '.')) ), '.', if( contains(string(variables('myFloat')), '.'), concat( last(split(string(variables('myFloat')), '.')), if( less(length(last(split(string(variables('myFloat')), '.'))), 2), '0', '' ) ), '00' ) )
Or, all in one line:
concat(if(greaterOrEquals(variables('myFloat'),1000),concat(substring(string(variables('myFloat')),0,max(0,sub(length(first(split(string(variables('myFloat')),'.'))),3))),',',substring(first(split(string(variables('myFloat')),'.')),max(0,sub(length(first(split(string(variables('myFloat')),'.'))),3)),min(3,length(first(split(string(variables('myFloat')),'.')))))),first(split(string(variables('myFloat')),'.'))),'.',if(contains(string(variables('myFloat')),'.'),concat(last(split(string(variables('myFloat')),'.')),if(less(length(last(split(string(variables('myFloat')),'.'))),2),'0','')),'00'))
It assumes the number was already rounded to hundreths (see my expression for rounding to hundreths in another post).
Here's the expression for COMPLETE currency formatting for numbers under 1 million:
concat('$',if(greaterOrEquals(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000),1000),concat(substring(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),0,max(0,sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.'))),3))),',',substring(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.')),max(0,sub(length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.'))),3)),min(3,length(first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.')))))),first(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.'))),'.',if(contains(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.'),concat(last(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.')),if(less(length(last(split(string(div(add(mul(variables('myFloat'),1000),sub(if(greaterOrEquals(mod(mul(variables('myFloat'),1000),10),5),10,0),mod(mul(variables('myFloat'),1000),10))),1000)),'.'))),2),'0','')),'00'))
It just injects the rounding expression from the linked post into the formatting expression in this post. It isn't the most efficient way to do this, I'm sure, but it works. Besides, what's a few dozen extra functions in a workaround expression for what javascript can accomplish with "myFloat.toFixed(2)"?
With the rounding expression, here are results you can expect:
WarrenBelz
146,660
Most Valuable Professional
RandyHayes
76,287
Super User 2024 Season 1
Pstork1
65,999
Most Valuable Professional