ManageNumber
Contents |
Gestion des nombres
L'affichage des nombres à virgules dans les formulaires pose plusieurs problème qui sont :
- gérer leur affichage en fonction de la langue
- quel est le nombre de virgule à afficher
Le premier problème implique l'utilisation du formattage des nombres avec la locale de l'utilisateur, la deuxième, l'utilisation d'un typage fonctionnel des nombres à afficher.
Le typage fonctionnel et déjà présent dans ofbizNeogia via le fichier de properties : arithmetic, utilisé notamment pour la gestion des BigDécimal.
Fonctionnement
Lors de la création de la form, dans la classe ModelFormField.java, lors de la présence d'un nombre à formatter, on construit on fonction du type demandé et les indications de dans le fichier de properties, le template de formatage que l'on passe ensuite avec la locale à une fonction de formatage.
- Les nombres à formater ont en suffix "-number"
- exemple : accounting-number, correspond à un formatage pour un affichage comptable des montants
Utilisation
Dans une form, lors de l'affichage d'un nombre, on renseigne l'information de la façon suivante :
<field name="x" title="y"><display type="accounting-number" /></field>
Ajout d'un nouveau type
Pour ajouter un nouveau type d'affichage fonctionnel voici la procédure :
- Configuration de type
- Ajouter les informations de formatage du nombre dans le fichier framework/common/config/arithmetic.properties
Exemple : stock.quantity.decimals = 3 stock.quantity.rounding = ROUND_HALF_UP
- Renseigner la dtd
- Ajouter le nouveau type dans le fichier xsd de définition des forms framework/widget/dtd/widget-form.xsd
Exemple :
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="accounting-number"/>
<xs:enumeration value="stock-quantity-number"/>
- Mettre en place la logique metier
- Ajouter dans le fichier framework/widget/src/org/ofbiz/widget/form/ModelForm.java le chargement de la nouvelle properties
Exemple :
if ( type.endsWith( "-number" )) {
Locale locale = (Locale) context.get("locale");
if (locale == null) locale = Locale.getDefault();
try {
Double parsedRetVal = (Double) ObjectType.simpleTypeConvert(retVal, "Double", null, locale, false);
String template = "#0.";
int decimals = 2;
if( type.startsWith("accounting") )
decimals = Integer.parseInt(UtilProperties.getPropertyValue( "arithmetic", "accounting.decimals", "1"));
if( type.startsWith("stock-quantity") )
decimals = Integer.parseInt(UtilProperties.getPropertyValue( "arithmetic", "stock.quantity.decimals", "3"));
for (;decimals > 0; decimals--)
template += "0";
retVal = UtilFormatOut.formatDecimalNumber(parsedRetVal.doubleValue(), template, locale);
} catch (GeneralException e) {
String errMsg = "Error formatting amount value [" + retVal + "]: " + e.toString();
Debug.logError(e, errMsg, module);
throw new IllegalArgumentException(errMsg);
}


