Zend_Measure-Creation.xml 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15157 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.measure.creation">
  5. <title>Erstellung einer Maßeinheit</title>
  6. <para>
  7. Bei der Erstellung einer Maßeinheit erwarten die <classname>Zend_Measure_*</classname> Methoden den
  8. Eingabe-/den Originalwert als ersten Parameter. Dieser kann ein
  9. <link linkend="zend.measure.creation.number"><code>nummerisches Argument</code>
  10. </link>
  11. , eine
  12. <link linkend="zend.measure.creation.string"><code>Zeichenkette</code>
  13. </link>
  14. ohne Einheit, oder eine
  15. <link linkend="zend.measure.creation.localized"><code>lokalisierte Zeichenkette</code>
  16. mit definierter Einheit</link> sein.
  17. Der zweite Parameter definiert die Art der Maßeinheit. Beide Parameter sind zwingend erforderlich. Die
  18. Sprache kann als optionaler dritter Parameter definiert werden.
  19. </para>
  20. <sect2 id="zend.measure.creation.number">
  21. <title>Eine Maßeinheit von einer Integer oder Floatzahl erstellen</title>
  22. <para>
  23. Zusätzlich zu Integerwerten können Floatwerte benutzt werden, aber
  24. <ulink url="http://www.php.net/float">"einfache Dezimalbrüche wie 0.1 or 0.7 können nicht in Ihre
  25. binäre Entsprechung konvertiert werden ohne den Verlust von Genauigkeit,"</ulink> was zeitweise
  26. zu erstaunlichen Ergebnissen führt. Genauso sollten zwei Floatzahlen nicht auf Gleichheit geprüft
  27. werden.
  28. </para>
  29. <example id="zend.measure.creation.number.example-1">
  30. <title>Erstellung einer Maßeinheit durch Integer oder Floatwerte</title>
  31. <programlisting role="php"><![CDATA[
  32. $measurement = 1234.7;
  33. $unit = new Zend_Measure_Length((integer)$measurement,
  34. Zend_Measure_Length::STANDARD);
  35. echo $unit;
  36. // Ausgabe '1234 m' (Meter)
  37. $unit = new Zend_Measure_Length($measurement, Zend_Measure_Length::STANDARD);
  38. echo $unit;
  39. // Ausgabe '1234.7 m' (Meter)
  40. ]]></programlisting>
  41. </example>
  42. </sect2>
  43. <sect2 id="zend.measure.creation.string">
  44. <title>Erstellen einer Maßeinheit aus Zeichenketten</title>
  45. <para>
  46. Viele Maßeinheiten die als Eingabe einer ZF Anwendung empfangen werden können nur als
  47. Zeichenketten den Klassen von <classname>Zend_Measure_*</classname> übergeben werden, wie z.B. Zahlen die in
  48. <ulink url="http://en.wikipedia.org/wiki/Roman_numerals">Römischer Schreibweise</ulink> geschrieben
  49. werden, oder extrem lange Binärwerte die die Genauigkeit von PHP's natürlichen Integer und Floattypen
  50. übersteigen würden. Da Integer auch als Zeichenketten geschrieben werden können sollten, sobald
  51. die Gefahr eines Genauigkeitverlustes durch die Limits von PHP's Integer und Floatwerten besteht,
  52. stattdessen Zeichenketten verwendet werden. <classname>Zend_Measure_Number</classname> benutzt die
  53. BCMath Erweiterung um aussergewöhnliche Genauigkeit zu unterstützen, wie im gezeigen Beispiel,
  54. um die Beschränkungen von vielen PHP Funktionen wie
  55. <ulink url="http://php.net/bin2dec"><code>bin2dec()</code></ulink> zu umgehen.
  56. </para>
  57. <example id="zend.measure.creation.string.example-1">
  58. <title>Erstellung einer Maßeinheit durch Strings</title>
  59. <programlisting role="php"><![CDATA[
  60. $mystring = "10010100111010111010100001011011101010001";
  61. $unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY);
  62. echo $unit;
  63. ]]></programlisting>
  64. </example>
  65. <para>
  66. Normalerweise kann <classname>Zend_Measure_*</classname> automatisch die gewünschte Maßeinheit aus einer
  67. gewöhnlichen Zeichenkette extrahieren. Nur die erste identifizierbare Zahl die Standard
  68. Europäisch/Lateinische Ziffern (0,1,2,3,4,5,6,7,8,9) benutzt wird für die Erstellung der Maßeinheit
  69. benutzt. Wenn weitere Zahlen in der Zeichenkette enthalten sind, werden diese Ignoriert.
  70. </para>
  71. <example id="zend.measure.creation.string.example-2">
  72. <title>Gewöhliche Texteingaben welche Maßeinheiten beinhalten</title>
  73. <programlisting role="php"><![CDATA[
  74. $mystring = "Mein Haus ist 125m² groß";
  75. $unit = new Zend_Measure_Area($mystring, Zend_Measure_Area::STANDARD);
  76. echo $unit; // Ausgabe "125 m²";
  77. $mystring = "Mein Haus ist 125m² groß, es hat 5 Räume mit jeweils 25m².";
  78. $unit = new Zend_Measure_Area($mystring, Zend_Measure_Area::STANDARD);
  79. echo $unit; // Ausgabe "125 m²";
  80. ]]></programlisting>
  81. </example>
  82. </sect2>
  83. <sect2 id="zend.measure.creation.localized">
  84. <title>Maßeinheiten von lokalisierten Zeichenketten</title>
  85. <para>
  86. Wenn eine Zeichenkette in lokalisierter Schreibweise eingegeben wurde, kann die richtige
  87. Interpretation nicht herausgefunden werden ohne das das gewünschte Gebietsschema bekannt ist.
  88. Die Teilung der Dezimalziffern mit "." und die Gruppierung der Tausender mit "," ist in der
  89. Englischen Sprache üblich, aber nur in anderen Sprachen. Um mit solchen Problemen umgehen zu können,
  90. besteht bei den lokalisierten Klassen der <classname>Zend_Measure_*</classname> Familie die Möglichkeit eine
  91. Sprache oder Region anzugeben, um einen Eingabewert eindeutig zu machen und die erwartete
  92. semantische Eingabe richtig zu interpretieren.
  93. </para>
  94. <example id="zend.measure.creation.localized.example-1">
  95. <title>Lokalisierte Zeichenketten</title>
  96. <programlisting role="php"><![CDATA[
  97. $locale = new Zend_Locale('de');
  98. $mystring = "Das Boot ist 1,234.50 lang.";
  99. $unit = new Zend_Measure_Length($mystring,
  100. Zend_Measure_Length::STANDARD,
  101. $locale);
  102. echo $unit; // Ausgabe "1.234 m"
  103. $mystring = "Das Boot ist 1,234.50 lang.";
  104. $unit = new Zend_Measure_Length($mystring,
  105. Zend_Measure_Length::STANDARD,
  106. 'en_US');
  107. echo $unit; // Ausgabe "1234.50 m"
  108. ]]></programlisting>
  109. </example>
  110. <para>
  111. Seit Zend Framework 1.7.0 unterstützt <classname>Zend_Measure</classname> auch die Verwendung eines
  112. Anwendungsweiten Gebietsschemas. Man kann ganz einfach eine <classname>Zend_Locale</classname> Instanz
  113. in der Registry setzen wie anbei gezeigt. Mit dieser Schreibweise kann man das manuelle Setzen eines
  114. Gebietsschemas für jede Instanz vergessen wenn man das selbe Gebietsschema mehrere Male verwenden
  115. will.
  116. </para>
  117. <programlisting role="php"><![CDATA[
  118. // In der Bootstrap Datei
  119. $locale = new Zend_Locale('de_AT');
  120. Zend_Registry::set('Zend_Locale', $locale);
  121. // Irgendwo in der eigenen Anwendung
  122. $length = new Zend_Measure_Length(Zend_Measure_Length::METER();
  123. ]]></programlisting>
  124. </sect2>
  125. </sect1>
  126. <!--
  127. vim:se ts=4 sw=4 et:
  128. -->