Anomalie #71

Saisie et enregistrement de nombres décimaux

Added by Grégory MARIGOT - TEICEE almost 12 years ago. Updated over 11 years ago.

Status:Fermé Start date:07/15/2010
Priority:Normal Due date:
Assignee:Grégory MARIGOT - TEICEE % Done:

100%

Category:-
Target version:EpnAdmin-CTN 1.1.3
Version ProxyEPN:1.0

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.

Associated revisions

Revision 303
Added by Grégory MARIGOT - TEICEE over 11 years ago

FIX #71: Rectifications sur l'usage des locales (fr_FR) sur Symfony et PHP (ne pas utiliser LC_NUMERIC !)

Revision 304
Added by Grégory MARIGOT - TEICEE over 11 years ago

FIX #71: Retrait d'une info de debuggage oubliée sur la r303

Revision 305
Added by Grégory MARIGOT - TEICEE over 11 years ago

FIX #71: Ajout d'un nouveau validateur personnalisé pour les décimaux qui accepte ',' en séparateur (conversoin en '.'). Utilisé pour le montant des factures et les coordonnées de géolocalisation

History

Updated by Grégory MARIGOT - TEICEE over 11 years ago

  • Status changed from Nouveau to In Progress
  • Assignee set to Grégory MARIGOT - TEICEE
  • % Done changed from 0 to 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.

Updated by Grégory MARIGOT - TEICEE over 11 years ago

  • Status changed from In Progress to Résolu
  • % Done changed from 80 to 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/*

Updated by Grégory MARIGOT - TEICEE over 11 years ago

  • Status changed from Résolu to Fermé

Updated by Grégory MARIGOT - TEICEE over 11 years ago

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).

Also available in: Atom PDF