Menu

Seite41B8

Anonymous

4.1.11.8 Formatierung

FormatterMain.xpt

Die saubere Trennung zwischen Formatierung, Konvertierung und Validierung ist nicht immer möglich und vielleicht auch nicht immer nötig. So werden Ganzzahl-Datentypen bereits bei ihrer Konvertierung im Validator ins richtige Format gebracht. Die Konvertierung ist in diesen Fällen auch eine Validierung, da beim Fehlschlagen der Konvertierung klar ist, dass es sich beim übergebenen String-Wert nicht um eine valide Ganzzahl handelt. Bei anderen Datentypen ist es dagegen notwendig, sie aus ihrem Darstellungsformat in ein Format zu bringen, in welchem sie erst validierbar werden.

In FormatterMain.xpt wird diesmal nicht nur auf andere Templates verwiesen, sondern gleich die Klasse Formatter.java beschrieben, die später ins helper-Package generiert wird. Wie auch bei den Validatoren, sind die Formatter für Datum, Dezimalzahlen und String-Werte in separate Template-Dateien ausgelagert wurden.

«IMPORT ecore»
«EXTENSION de::uni_leipzig::dreirad::generator::templates::common::Common»
«EXTENSION de::uni_leipzig::dreirad::generator::templates::common::TypeMapping»

«DEFINE formatterMain FOR EPackage»

   «FILE getPackageName().getAsPath() + "/client/helper/Formatter.java"»

      package «getPackageName()».client.helper;

      «IF getAllStringDataTypeNames().size > 0»
         «EXPAND StringFormatter::importDefinition FOR this»
      «ENDIF»
      «IF getAllDataTypeNames().contains("EDate")»
         «EXPAND DateFormatter::importDefinition FOR this»
      «ENDIF»

      «IF getAllDecimalNumberDataTypeNames().size > 0»
         «EXPAND DecimalFormatter::importDefinition FOR this»
      «ENDIF»

      /**
       * This class formates datatypes into a correct displayable form.
       * @author Jörg Reichert
       *
       */
      public class Formatter {

         «IF getAllStringDataTypeNames().size > 0»
            «EXPAND StringFormatter::attributeDefinition FOR this»
         «ENDIF»

         «IF getAllDataTypeNames().contains("EDate")»
            «EXPAND DateFormatter::attributeDefinition FOR this»
         «ENDIF»

         «EXPAND DecimalFormatter::attributeDefinition FOR this»

         «IF getAllStringDataTypeNames().size > 0»
            «EXPAND StringFormatter::methodDefinition FOR this»
         «ENDIF»

         «IF getAllDataTypeNames().contains("EDate")»
            «EXPAND DateFormatter::methodDefinition FOR this»
         «ENDIF»

         «FOREACH getAllDecimalNumberDataTypeNames() AS decimalNumberDataTypeName»
            «EXPAND DecimalFormatter::formatDefinition(decimalNumberDataTypeName.getJavaType()) FOR this»
         «ENDFOREACH»

         «IF getAllDecimalNumberDataTypeNames().size > 0»
            «EXPAND DecimalFormatter::deformatDefinition FOR this»
         «ENDIF»
      }
   «ENDFILE»
«ENDDEFINE»

DecimalFormatter.xpt

Bei der Formatierung von Dezimalzahlen wird der Punkt durch ein Komma ersetzt. Das ist natürlich eine Formatierung, die z.B. in Deutschland üblich ist, andernorts ist die Beibehaltung des Punktes üblich. Für die spätere Weiterentwicklung ist die Verwendung der Klasse Locale eher angebracht. Mit ihr könnten dann auch Formatierungen wie 10,500.78 bzw 10.500,78 unterstützt werden. Die Art der Formatierung wäre auch ein Aspekt, den man ins Datenmodell (Annotation des Attributs / eigener Stereotype) oder in der Generatorkonfiguration übernehmen könnte.

Neben der Formatierungsmethode gibt es auch eine Deformatierungsmethode, die die Ersetzung des Puntes wieder rückgängig macht.

Die Methoden sind so parametrisiert, dass für die momentan unterstützten Datentypen Double und Float jeweils eine Formatierungs- und Deformatierungs-Methode generiert wird.

«IMPORT ecore»
«EXTENSION de::uni_leipzig::dreirad::generator::templates::common::Common»

«DEFINE importDefinition FOR EPackage»
   import java.text.DecimalFormat;
   import java.text.NumberFormat;
«ENDDEFINE»

«DEFINE attributeDefinition FOR EPackage»
«ENDDEFINE»

«DEFINE staticDefinition FOR EPackage»
«ENDDEFINE»

«DEFINE formatDefinition(String javaDataTypeName) FOR EPackage»
   /**
    * Formats a given «javaDataTypeName» to a decimal with comma
    * with two digits after the comma.
    * @param decimalNumber unformatted «javaDataTypeName.toFirstLower()»
    * @return A string with the «javaDataTypeName.toFirstLower()» in the right format.
    */
   public static String getFormattedDecimalNumber(«javaDataTypeName» decimalNumber) {
      NumberFormat numberFormat = new DecimalFormat("#,##0.00");
      String decimalString = numberFormat.format(decimalNumber);
      return decimalString;
   }// getFormattedDecimalNumber
«ENDDEFINE»

«DEFINE deformatDefinition FOR EPackage»
   /**
    * deformats a formatted decimal number
    * @param decimalString a formatted decimal number
    * @return an unformatted decimal string
    */
   public static String getUnFormattedDecimalNumber(String decimalString) {
      int index = decimalString.indexOf(',');
      if(index > 0) {
         decimalString = decimalString.replace(",", ".");
      }// if
      return decimalString;
   }// getUnFormattedDecimalNumber
«ENDDEFINE»

DateFormatter und StringFormatter

Die Art und Weise der Formatierung von Datum und Strings ist Datenmodell-unabhängig, darum ist keine zusätzliche Parametrisierung erforderlich, die hier extra vorgestellt werden müsste. Für das Datum gilt das Gleiche wie für die Dezimalzahlen: das anzuwendende Datumsformat müsste in die Generatorkonfiguration oder ins Datenmodell ausgelagert werden, momentan wird "dd.MM.yyyy" im Code vorgeschrieben. String scheint eigentlich keine Formatierungsmethode zu verlangen, dennoch wurde eine Methode geschaffen, die einen Parameter vom Typ java.lang.Object entgegen nimmt. Ein Object mit der Belegung null wird zu "" konvertiert, nicht-leere Objekte werden mit String.valueOf(object) in einen String umgewandelt.


weiter zu 4.2.5.9 Helper-Klassen
zurück zu 4.2.5.7 Validierung
zurück zu 4.2.5 Templatierung der Präsentationsschicht
zurück zu 4.2 Implementierung des Generators
zurück zu 4 Implementierung
zurück zu [FrontPage]


Related

Documentation: FrontPage
Documentation: Seite000
Documentation: Seite400
Documentation: Seite41B
Documentation: Seite41B7
Documentation: Seite41B9
Documentation: Seite420