WINDEV / WEBDEV : Procédure TOUT TERRAIN, lorsque VAL() ne veut pas convertir une valeur alphanumérique composée en numérique

Voici une petite astuce sans prétention (niveau débutant ou intermédiaire) mais qui peut s'avérer utile à tous.

Il nous arrive souvent, d'avoir un code contenant à la fois des lettres et des chiffres dont on ne voudrait extraire que la valeur numérique.

Problématique : avec Windev, la fonction VAL() ne renvoie que les caractères numériques à gauche de la chaîne , jusqu'à ce qu'elle tombe sur autre chose qu'un numérique, et 0 si elle ne trouve aucun chiffre.

Exemples :

Val("TOTO36") renverra 0
Val("36TOTO22") renverra uniquement 36

Si vous avez des codes produits dans vos bases de données, du type "FDE29323XC", "KZ823", ou d'autres situations plus complexes, Val() n'est plus pertinent.

Imaginons par exemple que je veuille extraire la valeur numérique d'une chaîne comme la suivante :



les valeurs surlignées sont celles qu'il m'intéressent de conserver, alors que tout le reste n'est pas utile, je veux donc garder :


  • le signe + ou -, mais uniquement au début, et si je n'ai pas encore trouvé de chiffre
  • le premier séparateur décimal (pas les suivants), et uniquement celui que je désire (point ou virgule)
  • et tous les chiffres que je rencontre.


Voici donc une petite procédure qui permet de "filtrer" ce qui nous intéresse, et de renvoyer une valeur au format de variable "numérique". Cette fonction remplacera avantageusement Val() lorsque cette dernière ne renvoie pas la valeur souhaitée :




Testons-la avec notre chaîne :



Et voyons le résultat dans notre info box :




On a donc un Val() Tout terrain, qui mange de tout, et qui prend tout ce qu'il trouve de bout en bout de la chaîne source.

La procédure accepte une valeur par défaut que vous choisirez, et précisez le séparateur éventuel que vous voulez considérer dans votre chaîne source, si vous voulez traiter des décimaux.