Zend_Measure-Creation.xml 7.0 KB

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