Anomalie #71
ferméSaisie et enregistrement de nombres décimaux
100%
Description
Problème sur la gestion des valeurs décimales dans les formulaires symfony/propel :
- A la saisie il est demandé d'utiliser le point comme séparateur (le validator refuse la virgule)
- Néanmoins il semble que la valeur soit ensuite convertie selon la locale avec une virgule (affichage)
- L'enregistrement dans la BdD échoue à cause de la présence des virgules en séparateur dans la requête SQL
Les champs décimaux sont rares, mais le cas a été remarqué avec les nouvelles données de géolocalisation sur les EPNs, après recherche on retrouve le même problème sur le montant des factures.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- Statut changé de Nouveau à In Progress
- Assigné à mis à Grégory MARIGOT - TEICEE
- % réalisé changé de 0 à 80
Modifications publiées sur le svn (r303) :
L'usage de la locale 'fr' était problématique car appliquée de manière globale à PHP (setlocale avec LC_ALL). Dans ces conditions cela affecte également le format des nombres décimaux en les convertissant avec une virgule comme séparateur. Mais il est fortement préferrable de ne pas appliquer les préférences locales sur ce point afin de garder en interne les nombres flottants avec un point comme séparateur. Les requêtes SQL seront les 1ères à ne pas apprécier une virgule dans les nombres.
Des modifications ont donc été apportées pour que le PHP n'applique pas la locale sur LC_NUMERIC, donc le LC_ALL reste par défaut (en_EN) et seuls LC_MESSAGES, LC_TIME, LC_COLLATE, LC_CTYPE et LC_MONETARY prennent chacun la locale configurée.
Les changements ont été nécessaires à la fois dans les anciennes portions de code d'EpnAdmin et dans les objets du framework symfony.
De plus, la locale configurée dans le fichier apps/frontend/config/settings.yml a été passée de 'fr' à 'fr_FR', la syntaxe complète étant généralement préferrable (en particulier pour gettext).
Grâce à ces changements, le choix de locale est toujours respectées dans l'application, mais les nombres décimaux ne sont plus transformés avec une virgule. Les enregistrements en base de données des nombres flottants redevient fonctionnels.
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- Statut changé de In Progress à Résolu
- % réalisé changé de 80 à 100
Modifications publiées sur le svn (r305) :
Pour assouplir la saisie de nombres décimaux, il était souhaitable d'accepter aussi bien la virgule que le point comme séparateur décimal.
Le validateur sfValidatorNumber ne le permettait pas, effectuant un test PHP is_numeric() qui ne tolère que le point comme séparateur.
Un nouveau validateur a donc été défini, nommé sfValidatorFloat. Il hérite de sfValidatorNumber mais se charge de remplacer les virgules par des points avant de tester la validité de la valeur saisie.
Ce validateur est en place sur les champs 'xmap' et 'ymap' des fiches structures (géolocalisation des EPN), ainsi que sur le champs 'amount' des user_invoices (montant des factures usagers).
Ceci permet la saisie de valeurs décimales avec virgule ou point, le premier étant transformé vers le second.
Au passage, le message d'aide qui apparaissait sur les formulaires pour indiquer que les nombres devaient être saisis avec un point ont pu être supprimés.
Note : une purge des sessions PHP peut être utile pour éliminer les sessions ayant 'fr' au lieu de 'fr_FR' comme locale préférée rm -f /var/lib/php/session/*
Mis à jour par Grégory MARIGOT - TEICEE il y a presque 14 ans
- Statut changé de Résolu à Fermé
Mis à jour par Grégory MARIGOT - TEICEE il y a plus de 13 ans
Modifications publiées sur le svn (r394) :
L'utilisation de la locale pour les valeurs numériques a été mise en place dans la configuration de Symfony (via la classe personnalisée myI18N).
Les nombres décimaux sont ainsi affichés avec une virgule en séparateur, comme le veux la locale FR.
Celà ne présente visiblement pas de soucis (l'usage du validator "sfValidatorFloat" aidant à accepter les valeurs dans les formulaires et à conserver une cohérence interne).