From WikiChip
$isnumber Identifier - mIRC
< mirc‎ | identifiers
Revision as of 05:26, 2 December 2021 by Maroonbells (talk | contribs) (add detail)

$isnumber Returns $true if text is a number, otherwise returns $false.

Synopsis

$isnumber(text [,csend])

Note: This documentation is based on trial-and-error, as this is not documented in /help or in versions.txt and I didn't find any mention of it in a Forum post.

Parameters

text - The input string to be checked
csend - Switches which expand the types of numbers accepted, multiple switches allowed. Default accepts only integers >= 0

Switches

  • n - default when no switches are used. Accepts text consisting of ONLY numbers, allows only non-negative integers
  • s - also permits +- sign to be used
  • d - also permits the decimal, allowing numbers with fractions
  • e - also permits scientific notation only if using lowercase 'e'
  • c - combo of using 's' and 'd' and part of the 'e' range, but also accepts a sub-set of the codepoints also recognized by $regex \d when using the /u flag

Note: 'e' allows the exponent to be preceded by +-, but a leading 'sign' would also require the 'c' or 's' flags too, and doesn't recognize the base10 multiplier containing a decimal unless 'd' also used. 'e' does not recognize 'd' as the exponent the way $int(1d2) returns 100. 'c' recognizes the exponent only when the combined exponent from the leading multiplier and the final exponent does not combine into an exponent larger than e308, probably for the same reason that changing the 308 to 308 in $calc(10^308) changes the result to zero.

Properties

None

Example

//echo -a $isnumber(564)

will return $true

//echo -a $isnumber(abcdefG)

will return $false because not all the character are digit

//var %a 1.23e+45 | echo -a $isnumber(%a,e) vs $isnumber(%a,ed)

result: $false vs $true (because presence of the decimal requires 'd' or 'c' switch)

//var %a -123 | echo -a $isnumber(%a) vs $isnumber(%a,s)

result: $false vs $true (using a sign requires 's' or 'c')

Note: Most users would probably want to use some/all of the 'sdn' switches if there's a risk the string can contain of unwanted false matches with some hex strings triggering a match as if they're using scientific notation, and also because it has a partial subset of unexpected utf8 codepoints matching as if numeric. The next 2 examples shows that the 'c' switch matches 170 UTF8 codepoints, while using \d with $regex's /u switch matches 370.

//var %i 1 , %a | while (%i isnum 1-65535) { if ((%i !isnum 55296-57343) && ($isnumber($chr(%i),c))) var %a %a %i | inc %i } | echo -ag %a : $numtok(%a,32) tokens

//var %i 1 , %a | while (%i isnum 1-65535) { if ((%i !isnum 55296-57343) && ($regex($chr(%i),/^\d$/u))) var %a %a %i | inc %i } | echo -ag %a : $numtok(%a,32) tokens
//var -s %a $lower($crc(LFAX,0)) | echo -a %a is $isnumber(%a,c)

result: 08436e69 is $true Recognizes this hex string as numeric because the number following the lowercase 'e' is not large enough to prevent $calc(8436*10^69) to be larger than approx 2^1023.99.

Compatibility

Added: mIRC v7.58
Added on: 17 Nov 2019
Note: Unless otherwise stated, this was the date of original functionality.
Further enhancements may have been made in later versions.

See also