C# WPF - Contraindre la saisie de nombres décimaux

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

J’ai deux sacrés problèmes à soumettre à votre sagacité :p

Problème 1

Je suis en train de créer un Custom Control de champ numérique en C#/WPF et je n’arrive pas à contraindre le champ pour ne saisir que des valeurs numériques (décimaux compris, c’est-à-dire avec la virgule ou le point) et si possible en autorisant la saisie sous forme d’écriture scientifique (Ex : 1.12E-8).

Je souhaite :

  • Si possible éviter à chaque KeyDown une vérification avec un Regex
  • Éviter l’utilisation de bibliothèques externes

Une vérification de ce genre fonctionne pour le pavé numérique :

1
e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9

Mais en ce qui concerne les touches numériques au dessus des touches alphabétiques, ça ce complique quand il s’agit de vérifier la disposition anglaise ou française car il faut prendre la touche shift en considération.

Problème 2

Est-il possible de formater le nombre (séparation de milliers…) tout en saisissant les nombres ? En utilisant les méthodes de formatages de nombres fournit avec la bibliothèque .NET on arrive à peu près à le faire, avec pas mal de souci et de bug, du genre il faut recalculer le nombre de décimales saisies par l’utilisateur pour le prendre en compte dans le NumberFormatInfo.NumberDecimalDigits ainsi que des problèmes de curseur qui se remet au début du champ chaque fois que le textbox est formaté…


Avez-vous des solutions à me proposer ?

Merci d’avance !

Édité par john.doe

+0 -0

Salut,

À mon avis, ce genre de choses est à éviter :

1
e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9

Que se passe-t-il si l’utilisateur n’a pas de pavé numérique et utilise les chiffres du haut du clavier en AZERTY ? Que se passe-t-il si l’utilisateur veut coller le contenu de presse-papiers dans le champ ?

Pour moi, la validation d’un champ de texte doit vraiment se faire sur le texte lui-même et pas sur les numéros des touches appuyées.

Édité par motet-a

+0 -0
Auteur du sujet

Pour moi, la validation d’un champ de texte doit vraiment se faire sur le texte lui-même et pas sur les numéros des touches appuyées.

motet-a

Je voulais garder la validation du texte en dernier recours vu que l’utilisation de Regex est plus gourmande en ressource que la validation systématique de la touche appuyé. Parmi mes recherches, notamment sur stackoverflow, beaucoup propose la validation sur les touches mais effectivement cela ne me convient pas du tout.

Au final je vais valider par Regex, c’est la seule option qui me reste.

+0 -0

Je voulais garder la validation du texte en dernier recours vu que l’utilisation de Regex est plus gourmande en ressource que la validation systématique de la touche appuyé.

Euh… Tous les bons moteurs de regexps compilent les expressions vers un assembleur à bas niveau voire du langage machine. Ça me surprendrais énormément que tu ais des problèmes de performances dans ton cas. Si c’est juste pour vérifier que des nombres sont valides avec un pattern du genre ^[0-9]+\.[0-9]+$ sur des valeurs d’une dizaine de caractères, n’importe quel ordinateur devrait pouvoir exécuter ça des milliers et des milliers de fois par secondes.

+0 -0
Auteur du sujet

C’est plus sur un pattern du genre ^(?:[-+]?)(?:[0-9]*)(?:[\.,]?[0-9]*)?(?:[0-9][eE][-+]?[0-9]*)?$ sur un maximum d’environs 28 caractères.

Il y a un article qui date de 2006 écrit sur un développeur de Hotmail qui parle au sujet de ça et ça m’a fait peur de constater qu’il y a eu certains cas où le moteur a pris 25 secondes pour vérifier une vingtaine de caractères ! Je suis donc pas mal prudent sur ça…

EDIT : La validation se fait à chaque PreviewTextInput, donc y compris à chaque touche du clavier.

Édité par john.doe

+0 -0

Ouais, mais cet article monte un cas extrême, c’est à dire une regexp que personne n’écrira jamais en pratique (ou alors justement, dans un but malicieux).

Tu ne devrais recontrer aucun problème de performances avec ta regexp.

Édité par motet-a

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte