18 Replies Latest reply: Mar 23, 2012 8:13 AM by ACS LLC RSS

    Comparison of strings

    Speedtossi Community Member

      Hello,

       

      I have a problem with the comparison of strings:

      If I compare the values 0,5 and 5,0 I will get the result that the values are equal (Case 1).

      If I compare the values 0.5 and 5.0 the comparison will be correct (Case 2).

      If I compare the values with the method 'compare()' the comparison is correct (Case 3).

       

      Why is the result of case 1 wrong? Is there an explanation or is this a bug?

       

      <cfscript>

          // wrong comparsion

          writeoutput("Case 1: comparsion with 'if' and '==' <br>");

          string_one = "0,5";

          string_two = "5,0";

       

          writeoutput("values: <font color=green>String one: #String_one#</font> - <font color=red> String Two: #string_two#</font><br><br>");

          if (string_one == string_two) {

              writeoutput("wrong result after the comparsion: #string_one# is not #string_two#<br><br>");

          }

          else {

              writeoutput("right result after the comparsion: #string_one# is not #string_two#<br><br>");

          }

         

          writeoutput("===============================<br>");

         

          // right comparsion

          writeoutput("Case 2: comparsion with 'if' and '==' <br>");

          string_three = "0.5";

          string_four = "5.0";

       

          writeoutput("values: <font color=green>String three: #String_three#</font> - <font color=red> String four: #string_four#</font><br><br>");

          if (string_three == string_four) {

              writeoutput("wrong result after the comparsion: #string_three# is not #string_four#<br><br>");

          }

          else {

              writeoutput("right result after the comparsion: #string_three# is not #string_four#<br><br>");

          }   

          writeoutput("===============================<br>");

         

          // right comparsion

          writeoutput("Case 3: comparsion with 'compare' <br>");

          string_five = "0,5";

          string_six = "5,0";

         

          writeoutput("values: <font color=green>String five: #String_five#</font> - <font color=red> String six: #string_six#</font><br><br>");

          if (compare(string_five,string_six) EQ 0){

              writeoutput("wrong result after the comparsion: #string_five# is not #string_six#<br><br>");

          }

          else{

              writeoutput("right result after the comparsion: #string_five# is not #string_six#<br><br>");

          }

       

          writeoutput("===============================<br>");

         

          writeoutput('</strong>');

      </cfscript>

        • 1. Re: Comparison of strings
          Adam Cameron. Community Member

          All of this can be somewhat simplified to this:

           

           

          <cfif "0,6" eq "6,0">

                    EQUALS

          <cfelse>

                    NOT EQUALS

          </cfif>

          And the answer is - according to CF - "EQUALS".

           

          My reaction to that is:

           

          WTF?

           

          Not much help, sorry.

           

          --

          Adam

          • 2. Re: Comparison of strings
            Owain North Community Member

            I'd imagine it's evaluating it as a list, and the two lists are the same despite ordering.

            • 3. Re: Comparison of strings
              Adam Cameron. Community Member

              It only "works" with (single) digits.

               

              <cfif "0,A" eq "A,0">

                        EQUALS

              <cfelse>

                        NOT EQUALS

              </cfif>

               

              and

               

              <cfif "0,66" eq "66,0">

                        EQUALS

              <cfelse>

                        NOT EQUALS

              </cfif>

               

              both output "NOT EQUALS".

               

              --

              Adam

              • 4. Re: Comparison of strings
                Adam Cameron. Community Member

                Someone from Adobe has explained this to me.  Believe it or not, both "0,5" and "5,0" - to CF - mean 0th May 2012... which equates to 30 April 2012 ("of course" we all cry, whilst slapping our foreheads ;-).

                 

                Example:

                <cfset d1 = "0,5">

                <cfset d2 = "5,0">

                 

                <cfoutput>

                          #dateFormat(d1)#<br />

                          #dateFormat(d2)#<br />

                </cfoutput>

                 

                Sometimes I am still astounded by CF.

                 

                Not in a good way.

                 

                --

                Adam

                • 5. Re: Comparison of strings
                  Owain North Community Member

                  That is so weak, and is the kind of thing that's making me lean away from CF and towards strongly-typed languages like C#. That's just stupid.

                  • 6. Re: Comparison of strings
                    Adam Cameron. Community Member

                    That is so weak, and is the kind of thing that's making me lean away from CF and towards strongly-typed languages like C#. That's just stupid.

                     

                    That's a polite version of what I said to the Adobe chap (not that it was his fault, but he was the one in my line of fire at the time.  I shoot the messenger on a regular basis too ;-).

                     

                    --

                    Adam

                    • 7. Re: Comparison of strings
                      BKBK CommunityMVP

                      Owain North wrote:

                       

                      I'd imagine it's evaluating it as a list, and the two lists are the same despite ordering.

                      Difficult for us to sell, isn't it?

                       

                      Adam Cameron wrote:

                       

                      Someone from Adobe has explained this to me.  Believe it or not, both "0,5" and "5,0" - to CF - mean 0th May 2012... which equates to 30 April 2012 ("of course" we all cry, whilst slapping our foreheads ;-).

                      Does indeed make the eyes water.

                       

                      Speedtossi wrote:

                       

                      I have a problem with the comparison of strings:

                      If I compare the values 0,5 and 5,0 I will get the result that the values are equal (Case 1).

                       

                      It gets even better.

                       

                      <cfif "0,0000005" eq "5,0">

                      EQ

                      <cfelse>

                      NEQ

                      </cfif>

                       

                      gave me EQ.

                      • 8. Re: Comparison of strings
                        BKBK CommunityMVP

                        Speedtossi,

                        Referring to the news Adam brought from Adobe, I was also surprised when I first found out that isDate("0a") and isDate("3p") both return Yes. I suppose the moral is, when comparing strings, use compare or compareNoCase. When comparing numerical values, don't surround them with quotes.

                        • 10. Re: Comparison of strings
                          ffcai Community Member

                          I prefer strong typed language, like Java.

                          • 11. Re: Comparison of strings
                            ACS LLC Community Member

                            Came across this while trying to find a solution wondering if anybody can point me in the right direction

                             

                            I have two lists, let's say

                             

                            list1="a,b,c,d"

                            list2="b,c,d,a"

                             

                            Is there a quick and easy way to compare the two lists and see if they have exactly the same elements or differ in some way, I don't need to know how they differ, just that they are indeed different, order is not relevant to me either, just the values in the list.

                             

                            Using COMPARE does not work as it just seems to look at it as a string rather than a list

                             

                            Without getting into loops and code, is there a command for this (I am using CF8)

                             

                            Btw Just to clarify list1 would be a #valuelist()# from a SQL query, the other one would already exists as a hard coded list <CFSET list2="">

                             

                             

                            Thanks

                             

                            Mark

                            • 12. Re: Comparison of strings
                              Dan Bracuk Community Member

                              There is no command.  You have to think it through and write something appropriate for your own situation.    

                              • 13. Re: Comparison of strings
                                12Robots Community Member

                                Would this suit your purposes?

                                 

                                <cfset list1 = "a,b,c,d" />

                                <cfset list2 = "b,c,d,a" />

                                 

                                <cfif compare( listSort(list1, "text"), listSort(list2, "text") ) EQ 0>

                                They match

                                <cfelse>

                                They don't match

                                </cfif>

                                 

                                jason

                                • 14. Re: Comparison of strings
                                  ACS LLC Community Member

                                  I was just about to post

                                   

                                  I took a step back and made sure that the hard coded list was always sorted, and also applied an ORDER to the SQL statement, then when the hard coded one was recreated using a script that creates a script I made sure it was sorted, so the ORDERED SQL would always match, that way I was indeed able to utilize a straight forward EQUALS command.

                                   

                                  I am surprised that CF does not have a tag that allows for list comparison in the same way a string can be compared.

                                   

                                  Thanks for the input

                                   

                                  Mark

                                  • 15. Re: Comparison of strings
                                    Adam Cameron. Community Member

                                    I am surprised that CF does not have a tag that allows for list comparison in the same way a string can be compared.

                                     

                                     

                                    Well you can use any string function you like on a list: lists are just strings with a notion of an element delimiter after all.  So to test two lists for equality, one can use the compare() or compareNoCase() functions.  Or in most situations just the EQ operator will suffice.

                                     

                                    However CF lists are ordered, so if you want to implement the concept of an "unordered list" (which is a completely legitimate notion), then it's also up to you to implement the functionality to deal with them.

                                     

                                    --

                                    Adam

                                    • 16. Re: Comparison of strings
                                      BKBK CommunityMVP

                                      ffcai wrote:

                                       

                                      I prefer strong typed language, like Java.

                                      Then you want the coffeeshop round the corner.

                                      • 17. Re: Comparison of strings
                                        Dan Bracuk Community Member

                                        CF lists are ordered? 

                                        • 18. Re: Comparison of strings
                                          ACS LLC Community Member

                                          In my case the list is not ordered, or certainly was no initially ordered, it was originally manually created and hard coded, but it was being overwritten when required by CF and recreated, so I just had to use ORDER in the SQL so that when I came back to do the compare it was the same as the next ORDER SQL.

                                           

                                          The only way that COMPARE would give the desired result on a list is if both lists were in the same order, as robots12 above pointed out, you need to sort them both