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 :

Problème avec la fonction Val()


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Problème avec la fonction Val()
    Bonjour,

    J'ai un soucis avec la fonction val.
    J'ai de nombreux endroits où je dois déterminer si une chaine de caractère est un nombre ou une vrai chaine, et si c'est un nombre, je dois la convertir.
    J'utilisais donc jusqu'à présent la fonction Val().

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Val(Chaine, Entier, Erreur);
    if Erreur = 0 then
      //Traitement de la valeur "entier"
    else
     //Traitement de la valeur "chaine"
    Le problème est qu'un des utilisateurs vient d'utiliser une chaine nommée "XC" et que la fonction Val me renvoie 0 comme code erreur et 12 dans le variable "entier".
    Après recherche, je me suis rendu compte que "X" est le préfixe pour les nombres hexadécimaux. Et que du coup, il considère "XC" comme la valeur 12 en hexadécimal.
    J'ai 2000 endroits où la fonction Val est appelée...
    Plutôt que de redéfinir une nouvelle fonction Val et de le changer partout, n'y aurait-il pas un moyen de désactiver le préfixe Hexa dans la fonction Val ?
    Par exemple avec une directive de compilation ?

    Merci d'avance pour vos réponses.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 874
    Points : 11 363
    Points
    11 363
    Billets dans le blog
    6
    Par défaut
    Une possibilité pourrait être de redéfinir localement une procédure Val de même prototype, capable de faire le test et appel si besoin à l'originale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure Val(Chaine: string; Entier, Erreur: integer);
    begin
      if (length(Chaine)>0)
      and (UpKey(Chaine[1])='X')
      then Erreur:=-1 // par exemple
      else System.Val(Chaine, Entier, Erreur); // si dans l'unité System
    end;

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Merci, j'y avais pensé, mais malheureusement, mes appels à la fonction val sont disséminés dans des centaines de fichiers. Cela m'obligerait à redéfinir localement la fonction dans chacun des fichiers. (Je travaille sur un source de quasiment 1 millions de lignes...).
    Merci quand même.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut


    Val, c'est un peu brutale !
    Depuis D5\D6, il y avait les variantes comme TryStrToInt ou TryStrToFloat
    Cela aurait été plus élégant de créer une fonction IsNumeric ou IsAlpha, juste pour simplifier la lecture du code, tu aurais ainsi éviter ce désagrément aujourd'hui !

    TryStrToInt utilise x, 0x, 0X et $ aussi en plus de X
    Hors TryStrToInt est une simple encapsulation de Val()
    Cela va faire beaucoup de cas à gérer !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Merci.
    Bon, ben je suis bon pour me faire une fonction Val non hexa qui teste avant et à faire un remplacement partout...

Discussions similaires

  1. Problème avec la fonction Val
    Par yannoch123 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/06/2013, 15h47
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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