none
Bug dans String.Compare(s1,s2) ? RRS feed

  • Discussion générale

  • Bonjour,

    J'ai testé ceci sur deux PC, avec les mêmes résultats.

    String.compare("Boîte d'envoi","Boîte de réception") renvoie 1 !  (Faux) : Pour lui "Boîte d'envoi" > "Boîte de réception". Vu que l'apostrophe a le code ASCII 39D et le "e", le code ASCII 101D, Boîte d'envoi est plus petit. 

    String.compare("Boîte d'","Boîte de") renvoie -1 (Vrai)

    String.compare("Boîte d'e","Boîte de") renvoie 1 (Faux)

    ? "Boîte d'envoi" < "Boîte de réception" renvoie True (Vrai)

    String.Compare n'a pas l'air d'apprécier les apostrophes ou c'est moi qui ai un problème (ce qui est possible aussi).

    Cordialement.

    jeudi 28 septembre 2017 09:35

Toutes les réponses

  • Avec l'option

    StringComparison.Ordinal
    ça renvoie bien les différences négatives

    jeudi 28 septembre 2017 17:11
  • Salut , 

    Dans ce cas il faut utiliser les CompareOptions. (using System.Globalization Il y a plusieur opion de comparaison que vou pouvez utilisez avec String.Compare() .

    Si dans votre ca vous assumé que 
    "Boîte d'e""Boîte de" sont égaux , il faut utilise l'option CompareOptions.IgnoreSymbols comme ca  : 

    int flag = String.Compare("Boîte d'e""Boîte de",new CultureInfo("en-US"),
                                CompareOptions.IgnoreSymbols);

    Sinon vous pouvez trouvez toute les options disponible dans ce lien :
    https://msdn.microsoft.com/en-us/library/system.globalization.compareoptions(v=vs.110).aspx

    Comment les utiliser : 

    https://msdn.microsoft.com/en-us/library/cc190529(v=vs.110).aspx#Examples


     
    vendredi 29 septembre 2017 08:38
  • Merci Ahd Ben Kheder,

    J'ai essayé toutes les options de CompareOptions, mais seule CompareOptions.StringSort (dont la définition est indiquée ci-dessous) fonctionne.

    String.Compare("Boite d'e", "Boite de", My.Application.Culture, Globalization.CompareOptions.StringSort) -> -1 (vrai)

    CompareOptions.IgnoreSymbols, retire l'apostrophe, donc "Boite d'e" = "Boite de" ce qui n'est pas le but recherché dans un programme de tri (ni un autre).

    Pour moi, il y a bien un bug sur String.Compare() puisque, de base, ça devrait renvoyer le bon résultat (-1) d'autant qu'en comparant directement les deux chaines, ça passe.

    Bien cordialement.

    StringSort :<abbr class="affil"></abbr>Indique que la comparaison des chaînes doit utiliser l'algorithme de tri de chaîne.Dans un ordre de chaîne, le trait d'union et l'apostrophe, ainsi que d'autres symboles non traditionnels, viennent avant les caractères alphanumériques.

    C'est amusant de voir que les "-" et apostrophes sont des symboles NON TRADITIONNELS qui viennent AVANT les caractères alphanumériques. Comme s'il en était autrement. Dans toutes les tables ASCII, veilles de 30 ans et plus, le tiret et l'apostrophe ont toujours été placés avant les caractères alphanumériques et leur sont donc inférieur lors des comparaisons. 

    mardi 3 octobre 2017 14:56