dolibarr-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Dolibarr-dev] A propos des appels à pric e2num et price et de la lo


From: Antoine Delvaux
Subject: Re: [Dolibarr-dev] A propos des appels à pric e2num et price et de la locale fr_BE
Date: Fri, 05 Sep 2008 11:11:24 +0100
User-agent: Thunderbird 2.0.0.16 (X11/20080724)

Bonjour Eldy,


Merci pour ta réponse.

>> Seulement, la solution n'est pas simple, car les appels à price2num() 
>> colorent
>> très fort le code.  J'ai pour le moment contourné le problème, en commentant 
>> le
>> code récupérant le séparateur des milliers de la locale,  L'autre solution 
>> est
>> d'utiliser la locale 'fr_FR' mais aucune des 2 n'est une solution durable.
>>
>> Bref, qu'en pensez-vous ?  Si je m'attaque au problème, quel chemin me
>> préconisez-vous ?  Merci pour vos avis !
>>   
> Je me suis attaqué au problème.
> Un gros boulot car le seul moyen de s'en sortir en l'état actuel avec
> fr_BE et que tout soit en fr_BE (PHP, OS, Mysql), ce qui n'est casiment
> jamais le cas surtout mysql qui garde quelquesoit la langue, le "."
> comme séparateur de décimal.

De mon opinion, le principal problème de price2num est qu'elle est utilisée dans
2 contextes assez différents :
- pour reprendre des prix en provenance de l'I/F web, formatés suivant la locale
- pour reprendre des prix en provenance de la BD, formatés avec le '.' comme
séparateur décimal

L'idéal ne serait-il pas de séparer cette fonction en 2, suivant son usage ?  Ce
qui permettrait dès lors de résoudre ce bug de manière plus propre.  Mais le
gros inconvénient, j'en conviens, est que cela demande un gros refactoring car
price2num est appelée en bcp d'endroits.

> Autre solution, passer tous les code Dolibarr et ne plus permettre la
> saisie ouverte (droit de saisir un nombre sans le séparateur de milliers
> qui emmerdent tout le monde et utilisation obligatoire de la virgule).
> Hors ceci me parait beaucoup trop contraignant juste pour avoir le droit
> de "voir" des nombres affichées au format Belgique.

Oui, je suis d'accord avec toi, bcp plus contraignant.

> Il y a une solution beaucoup plus simple.
> Prendre la version CVS de la branche DOLIBARR_2_4_BRANCH ou la 2.5 dev
> dans laquelle on a modifié le fichier main.lang de fr_BE et la ligne
> SeparatorThousand=.
> par
> SeparatorThousand=

Oui, c'est une autre idée qui a l'avantage d'être immédiate.

Je proposerais bien encore une autre solution, qui a l'avantage de pouvoir
garder le '.' et a juste un petit inconvénient.  C'est dans le patch joint (diff
contre la 2.4.0).  Le petit inconvénient est que lorsqu'on a un nombre tel que
"1.001" on ne peut pas trancher entre "mille et un" et "un virgule zéro zéro 
un".

Cela dit, ce problème est potentiellement plus large que la locale fr_BE, il se
pose pour toute locale utilisant le '.' comme séparateur de milliers.  D'après
http://www.unicode.org/cldr/version/1.6.1.html cela en représente tout de même
35 hors de 454 (voir liste en annexe également).  Même s'il est peu probable que
Dolibarr soit traduit dans toutes ces locales prochainement, ça vaut peut-être
la peine de trouver une solution à long terme ?

Antoine.
--- dolibarr-2.4.0/htdocs/lib/functions.lib.php 2008-08-19 23:08:14.000000000 
+0200
+++ dolibarr/htdocs/lib/functions.lib.php       2008-09-04 13:05:32.801251283 
+0200
@@ -2042,20 +2042,22 @@ function price2num($amount,$rounding='')
        if ($langs->trans("SeparatorDecimal") != "SeparatorDecimal")  
$dec=$langs->trans("SeparatorDecimal");
        if ($langs->trans("SeparatorThousand")!= "SeparatorThousand") 
$thousand=$langs->trans("SeparatorThousand");
        
+       // To care for belgian users
+       if ($thousand == '.' && $dec != '.' &&
+               (strpos($amount,'.') != strrpos($amount,'.')
+               || strpos($amount,'.') < strrpos($amount,$dec))
+               ) $amount=str_replace('.','',$amount);
        if ($thousand != ',') $amount=str_replace(',','.',$amount);     // To 
accept 2 notations for french users
        $amount=str_replace(' ','',$amount);    // To avoid spaces
        $amount=str_replace($dec,'.',$amount);
-       $amount=str_replace($thousand,'',$amount);
+       if ($thousand != '.') $amount=str_replace($thousand,'',$amount); // To 
care for belgian users
+
        if ($rounding)
        {
-               if ($rounding == 'MU')     $amount = 
round($amount,$conf->global->MAIN_MAX_DECIMALS_UNIT);
-               elseif ($rounding == 'MT') $amount = 
round($amount,$conf->global->MAIN_MAX_DECIMALS_TOT);
-               elseif ($rounding == 'MS') $amount = 
round($amount,$conf->global->MAIN_MAX_DECIMALS_SHOWN);
-               else $amount='ErrorBadParameterProvidedToFunction';
-               if ($thousand != ',') $amount=str_replace(',','.',$amount);     
// To accept 2 notations for french users
-               $amount=str_replace(' ','',$amount);    // To avoid spaces
-               $amount=str_replace($dec,'.',$amount);
-               $amount=str_replace($thousand,'',$amount);
+               if ($rounding == 'MU') $prec = 
pow(10,$conf->global->MAIN_MAX_DECIMALS_UNIT);
+               elseif ($rounding == 'MT') $prec = 
pow(10,$conf->global->MAIN_MAX_DECIMALS_TOT);
+               elseif ($rounding == 'MS') $prec = 
pow(10,$conf->global->MAIN_MAX_DECIMALS_SHOWN);
+               $amount = ceil($amount*$prec)/$prec;
        }
        return $amount;
 }
@@ -3059,4 +3061,4 @@ function dol_sort_array($array, $index, 
        return $array;
 }
 
-?>
\ Pas de fin de ligne à la fin du fichier.
+?>
az.xml:
bs.xml:
ca.xml:
da.xml:
de.xml:
el.xml:
en_BE.xml:
es.xml:
eu.xml:
fo.xml:
fr_BE.xml:
fr_LU.xml:
gl.xml:
hr.xml:
hy.xml:
ia.xml:
id.xml:
is.xml:
it.xml:
ka.xml:
kl.xml:
km.xml:
lt.xml:
mk.xml:
ms_BN.xml:
nl.xml:
pt.xml:
ro.xml:
rw.xml:
sl.xml:
sq.xml:
sr_Cyrl_BA.xml:
sr.xml:
tr.xml:
vi.xml:

reply via email to

[Prev in Thread] Current Thread [Next in Thread]