IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Comparer des chaînes en tenant compte de la longueur


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut Comparer des chaînes en tenant compte de la longueur
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      A, B: string;
    begin
      A := '2';
      B := '12,8';
      ShowMessage(CompareStr(A, B).ToString);
    affiche 1 , semblant indiquer que 1 est supérieur à 12,8.
    Je sais, la comparaison se fait sur chaque caractère, donc 2 est bien supérieur à 1.

    Dans mes comparaisons, à chaque fois, j'ajoute autant de 0 que nécessaire pour avoir 2 chaînes de longueurs identiques afin d'avoir une comparaison logique (dans mon cas précis) (un peu lourd).
    L'autre solution serait de convertir en valeurs numériques mais là aussi ce serait un peu lourdingue.

    Est-ce qu'il n'y aurait pas une astuce ou une option de compilation pour que, dans ce bloc de code, Delphi tienne aussi compte de la longueur de la chaîne ?
    B étant de longueur supérieure à celle de A, il déduirait que B est forcément supérieur.
    Et si les chaînes sont de longueurs égales, il prendrait en compte les caractères un par un.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Ajouter des zéros n'est pas très gourmand...

    Tu peux aussi conserver la chaine jusqu'à la virgule...

    Mais de toute façon je vois mal comment t'en sortir sans faire un peu de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    function APlusGranQueB(A,B:string)
    var C:string;
         pA,pB:integer;
    begin
        result:=false;
     
        pA:=Pos(',',A);
        if pA=0 then begin//S'assure qu'il y ait le séparateur décimal dans chaque chaine
             A:=A+',';
             pA:=length(A);
        end;
        pB:=Pos(',',B);
        if pB=0 then begin//S'assure qu'il y ait le séparateur décimal dans chaque chaine
             B:=B+',';
             pB:=length(B);
        end;
     
        if pA>pB then begin
            result:=true;
            exit;
        end;
        if pB>pA then exit;
     
        C:=StringOfChar('0',max(length(A),Length(B));//Formate les nombre pour avoir la même longueur
        for i:=1 to length(A) do C[i]:=A[i];
        C:=StringOfChar('0',length(C));
        for i:=1 to length(B) do C[i]:=B[i];
     
        if A>B then begin
             result:=true;
             exit;
        end;
     
    end;
    Pas testé

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    intéressant ! Merci pour le code. Je vais tester ça.
    J'ai tout de même un petit doute sur le formatage où tu remplis C 2 fois de suite.
    Mais il est vrai que je viens de me lever .... pas encore bien réveillé :-)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'ai tout de même un petit doute sur le formatage où tu remplis C 2 fois de suite.
    Tout à fait!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function APlusGranQueB(A,B:string)
    var pA,pB:integer;
    begin
        result:=false;
     
        pA:=Pos(',',A);
        if pA=0 then begin//S'assure qu'il y ait le séparateur décimal dans chaque chaine
             A:=A+',';
             pA:=length(A);
        end;
        pB:=Pos(',',B);
        if pB=0 then begin//S'assure qu'il y ait le séparateur décimal dans chaque chaine
             B:=B+',';
             pB:=length(B);
        end;
     
        if pA>pB then begin
            result:=true;
            exit;
        end;
        if pB>pA then exit;
     
        A:=A+StringOfChar('0',max(0,Length(B)-length(A));//Formate les nombres pour avoir la même longueur
        B:=B+StringOfChar('0',max(0,Length(A)-length(B));
     
        if A>B then begin
             result:=true;
             exit;
        end;
     
    end;

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 383
    Points : 2 996
    Points
    2 996
    Par défaut
    :-) J'étais donc mieux réveillé que je ne le pensais

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 343
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,

    rapidité à tester par rapport à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function Comparaison(const S1, S2: string): Integer;
    // Convertit S1 et S2 en nombre et les compare.
    //La valeur renvoyée est inférieure à 0 si S1 est inférieure à S2,
    //0 si S1 égal S2, ou supérieure à 0 si S1 est supérieure à S2.
    Var
      N1, N2 : Double ;  // Ou plus ?
    Begin
      N1 := StrToFloatDef(S1,0) ;
      N2 := StrToFloatDef(S2,0) ;
      Result := CompareValue(N1,N2) ;
    End ;
    A+
    Charly

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/11/2015, 13h14
  2. [XL-2007] Ecrire des données en tenant compte des filtres actifs
    Par clao260 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/12/2012, 20h13
  3. Réponses: 16
    Dernier message: 25/09/2009, 15h10
  4. Comparer des chaînes de caractères
    Par aurelie689 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 02/05/2009, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo