Page 1 of 1

Evaluate if field is number or string

Posted: Wed Apr 26, 2017 11:19 am
by xavram
Is there a syntax that would tell me if a field is a number, a string expression that returns a number, or a just a regular string?

For example, the field could contain...

7
1d6+3
This is not a number

...and I'd like an expression that would return "7", eval(1d6+3), or "This is not a number".

I know that if I try "eval" on the 3rd line, it will throw an error, so that's out. IsNumber would work on the 1st, but not the second.

Any ideas?

Re: Evaluate if field is number or string

Posted: Wed Apr 26, 2017 12:28 pm
by aliasmask
Here's a summary of something I do.

Code: Select all

[H: abort(input("expression||Enter an Expression|TEXT"))]
[H, if(json.isEmpty(expression)): value = 0; value = expression]
[H, if(! isNumber(value)): value = eval(value)]
[R: strformat("%{expression} = %{value}")]
So, as long as the expression evaluates to a number it should work fine. For example, if you enter "corn" and corn isn't defined it will ask you for the value.

Here's a snippet of an example I use with my attack macro where players can enter in their own attack string.

Code: Select all

<!-- Temp Attack -->
[H, if(json.isEmpty(tempATK)): tempATK = 0]
[H: tempATK.total = 0]
[H, if(isNumber(tempATK)), code: {
   [H, if(tempATK): attackTipOutput = json.set(attackTipOutput,"Temp Attack",tempATK)]
   [H: tempATK.total = tempATK]
   [H: tempATK.json = tempATK]
};{
   [H: tempATK.json = json.fromList(tempATK)]
   [H, foreach(atk,tempATK.json), code: {
      [H: index = roll.count +1]
      [H: atk.name = "Temp Attack "+index]
      [H, if(isNumber(atk)): atk.value = atk; atk.value = eval(atk)]
      [H, if(atk.value && isNumber(atk)): attackTipOutput = json.set(attackTipOutput,atk.name,atk)]
      [H, if(atk.value && ! isNumber(atk)): attackTipOutput = json.set(attackTipOutput,atk.name,strformat("%{atk} = %{atk.value}"))]
      [H: tempATK.total = tempATK.total + atk.value]
   }]
}] 
 

Re: Evaluate if field is number or string

Posted: Wed Apr 26, 2017 4:46 pm
by xavram
Hmmm, that doesn't quite work for what I need.

if you enter "Corn", that's what I want to be outputted. Not another prompt for what that means...

In my "spell setup" section, there's a field for Damage. Works fine if they enter in 10 or 2d6, you get the right result broadcasted when the spell is cast. But I was thinking it would be nice if they players could use that field for non numeric stuff, so they could put in "Increases saves for 3 rounds" or something like that. There's a lot of "cast the spell, then go try to remember what that spell actually does". This was my idea as a workaround for that, without adding a new field to the json object for spells.

Re: Evaluate if field is number or string

Posted: Wed Apr 26, 2017 5:21 pm
by xavram
Got it

Code: Select all

[H: abort(input("expression||Enter an Expression|TEXT"))]

[h : firstChar = substring(expression, 0, 1)]

[h : endResult = ""]

[h, if(isNumber(firstChar)), code : {
	[h : endResult = eval(string(expression))]
};
{
	[h : endResult = expression]
}]

[broadcast("end = " + endResult)]

Re: Evaluate if field is number or string

Posted: Wed Apr 26, 2017 6:08 pm
by aliasmask
I think it will give an error if blank though for substring also if the first char is a number like for 0junk for an entry. If you're parsing another source it's possible stuff like that could happen.

Re: Evaluate if field is number or string

Posted: Wed Apr 26, 2017 7:59 pm
by xavram
It should never be blank, in the full macro, it turns a blank into a "0".

And yes someone could enter in "0haha i messed up your code"...at which point I will simply say, "garbage in, garbage out". :)