String comparison in OpenInsight - Part 4 - String-Only operators

Published 14 SEP 2022 at 05:34:04PM

Updated on 20 SEP 2022 at 05:34:04PM

Basic+ is a dynamically-typed language, and sometimes the system will attempt to change the type of a variable before using it in an operation. For example, if we have variable containing a numeric value as a string, and we attempt to compare it to a variable containing an actual numeric value, then the former will be coerced to a numeric format before the comparison, e.g.:

   StrVar = "3"  ; // String representing an integer
   NumVar = 7    ; // Integer
 
   Ans = ( StrVar = NumVar ) ; // Ans is FALSE$ and StrVar 
                             ; // is converted to an Integer

This works well in the vast majority of cases, but causes issues when attempting to compare strings that that could be numbers but really aren't for the purposes of the comparison. For example, consider the following:

   Var1 = "12"    ; // String
   Var2 = "012"   ; // String
 
   Ans = ( VarA = VarB ) ; // Ans = TRUE$ - should be FALSE$!!

The system first attempts to coerce the operands to a numeric format, and of course it can because they both evaluate to the number 12, and are therefore treated as equal. If you wish to compare them both as strings, the usual solution has been to change them so that they cannot be converted to a number, usually by prefixing them with a letter or symbol like so:

   Var1 = "12"    ; // String
   Var2 = "012"   ; // String
 
   Ans = ( ( "X" : VarA ) = ( "X" : VarB ) ) ; // Ans = FALSE$

Although this works it hurts performance and can be a cumbersome solution.

OpenInsight 10.2 introduces a new set of extended comparison operators to Basic+ that ensure both operands are coerced to a string type (if needed) before being evaluated, and provides the following benefits:

  • Removes the need for any concatenation thereby avoiding unnecessary copying
  • Removes the need to check if a variable can be a number before the comparison
  • Makes it obvious that you are performing a "string-only" comparison so your code looks cleaner.

The new (case-sensitive) operators are:

OperatorDescription
_eqs Equals operator
_nes Not Equals operator
_lts Less Than operator
_les Less Than Or Equals operator
_gts Greater Than operator
_ges Greater Than Or Equals operator

There is also matching set of case-insensitive operators too:

OperatorDescription
_eqsc Case-Insensitive Equals operator
_nesc Case-Insensitive Not Equals operator
_ltsc Case-Insensitive Less Than operator
_lesc Case-Insensitive Less Than Or Equals operator
_gtsc Case-Insensitive Greater Than operator
_gesc Case-Insensitive Greater Than Or Equals operator

So we could write the previous example like so:

   Var1 = "12"    ; // String
   Var2 = "012"   ; // String
 
   Ans = ( VarA _eqs VarB ) ; // Ans = FALSE$

Hopefully you'll find this a useful addition when performing string-only comparisons in your own applications.

Comments


At 15 SEP 2022 06:22AM dbakke wrote:

Thumbs up!

Original ID: revdevx.com/?p=3739
  • third_party_content/community/commentary/revdevx/19981.7319907407.txt
  • Last modified: 2024/01/29 20:23
  • by 127.0.0.1