| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 17175 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.measure.creation">
- <title>Erstellung einer Maßeinheit</title>
- <para>
- Bei der Erstellung einer Maßeinheit erwarten die <classname>Zend_Measure_*</classname>
- Methoden den Eingabe-/den Originalwert als ersten Parameter. Dieser kann ein
- <link linkend="zend.measure.creation.number"><code>nummerisches Argument</code></link>, eine
- <link linkend="zend.measure.creation.string"><code>Zeichenkette</code></link> oder
- Einheit, oder eine <link linkend="zend.measure.creation.localized"><code>lokalisierte
- Zeichenkette</code> mit definierter Einheit</link> sein. Der zweite Parameter definiert die
- Art der Maßeinheit. Beide Parameter sind zwingend erforderlich. Die Sprache kann als
- optionaler dritter Parameter definiert werden.
- </para>
- <sect2 id="zend.measure.creation.number">
- <title>Eine Maßeinheit von einer Integer oder Floatzahl erstellen</title>
- <para>
- Zusätzlich zu Integerwerten können Floatwerte benutzt werden, aber
- <ulink url="http://www.php.net/float">"einfache Dezimalbrüche wie 0.1 or 0.7 können
- nicht in Ihre binäre Entsprechung konvertiert werden ohne den Verlust von
- Genauigkeit,"</ulink> was zeitweise zu erstaunlichen Ergebnissen führt. Genauso sollten
- zwei Floatzahlen nicht auf Gleichheit geprüft werden.
- </para>
- <example id="zend.measure.creation.number.example-1">
- <title>Erstellung einer Maßeinheit durch Integer oder Floatwerte</title>
- <programlisting language="php"><![CDATA[
- $measurement = 1234.7;
- $unit = new Zend_Measure_Length((integer)$measurement,
- Zend_Measure_Length::STANDARD);
- echo $unit;
- // Ausgabe '1234 m' (Meter)
- $unit = new Zend_Measure_Length($measurement, Zend_Measure_Length::STANDARD);
- echo $unit;
- // Ausgabe '1234.7 m' (Meter)
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.measure.creation.string">
- <title>Erstellen einer Maßeinheit aus Zeichenketten</title>
- <para>
- Viele Maßeinheiten die als Eingabe einer Zend Framework Anwendung empfangen werden
- können nur als Zeichenketten den Klassen von <classname>Zend_Measure_*</classname>
- übergeben werden, wie z.B. Zahlen die in <ulink
- url="http://en.wikipedia.org/wiki/Roman_numerals">Römischer Schreibweise</ulink>
- geschrieben werden, oder extrem lange Binärwerte die die Genauigkeit von
- <acronym>PHP</acronym>'s natürlichen Integer und Floattypen übersteigen würden. Da
- Integer auch als Zeichenketten geschrieben werden können sollten, sobald die Gefahr
- eines Genauigkeitverlustes durch die Limits von <acronym>PHP</acronym>'s Integer und
- Floatwerten besteht, stattdessen Zeichenketten verwendet werden.
- <classname>Zend_Measure_Number</classname> benutzt die BCMath Erweiterung um
- aussergewöhnliche Genauigkeit zu unterstützen, wie im gezeigen Beispiel, um die
- Beschränkungen von vielen <acronym>PHP</acronym> Funktionen wie <ulink
- url="http://php.net/bin2dec"><methodname>bin2dec()</methodname></ulink> zu umgehen.
- </para>
- <example id="zend.measure.creation.string.example-1">
- <title>Erstellung einer Maßeinheit durch Strings</title>
- <programlisting language="php"><![CDATA[
- $mystring = "10010100111010111010100001011011101010001";
- $unit = new Zend_Measure_Number($mystring, Zend_Measure_Number::BINARY);
- echo $unit;
- ]]></programlisting>
- </example>
- <para>
- Normalerweise kann <classname>Zend_Measure_*</classname> automatisch die gewünschte
- Maßeinheit aus einer gewöhnlichen Zeichenkette extrahieren. Nur die erste
- identifizierbare Zahl die Standard Europäisch/Lateinische Ziffern (0,1,2,3,4,5,6,7,8,9)
- benutzt wird für die Erstellung der Maßeinheit benutzt. Wenn weitere Zahlen in der
- Zeichenkette enthalten sind, werden diese Ignoriert.
- </para>
- <example id="zend.measure.creation.string.example-2">
- <title>Gewöhliche Texteingaben welche Maßeinheiten beinhalten</title>
- <programlisting language="php"><![CDATA[
- $mystring = "Mein Haus ist 125m² groß";
- $unit = new Zend_Measure_Area($mystring, Zend_Measure_Area::STANDARD);
- echo $unit; // Ausgabe "125 m²";
- $mystring = "Mein Haus ist 125m² groß, es hat 5 Räume mit jeweils 25m².";
- $unit = new Zend_Measure_Area($mystring, Zend_Measure_Area::STANDARD);
- echo $unit; // Ausgabe "125 m²";
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.measure.creation.localized">
- <title>Maßeinheiten von lokalisierten Zeichenketten</title>
- <para>
- Wenn eine Zeichenkette in lokalisierter Schreibweise eingegeben wurde, kann die richtige
- Interpretation nicht herausgefunden werden ohne das das gewünschte Gebietsschema bekannt
- ist. Die Teilung der Dezimalziffern mit "." und die Gruppierung der Tausender mit ","
- ist in der Englischen Sprache üblich, aber nur in anderen Sprachen. Um mit solchen
- Problemen umgehen zu können, besteht bei den lokalisierten Klassen der
- <classname>Zend_Measure_*</classname> Familie die Möglichkeit eine Sprache oder Region
- anzugeben, um einen Eingabewert eindeutig zu machen und die erwartete semantische
- Eingabe richtig zu interpretieren.
- </para>
- <example id="zend.measure.creation.localized.example-1">
- <title>Lokalisierte Zeichenketten</title>
- <programlisting language="php"><![CDATA[
- $locale = new Zend_Locale('de');
- $mystring = "Das Boot ist 1,234.50 lang.";
- $unit = new Zend_Measure_Length($mystring,
- Zend_Measure_Length::STANDARD,
- $locale);
- echo $unit; // Ausgabe "1.234 m"
- $mystring = "Das Boot ist 1,234.50 lang.";
- $unit = new Zend_Measure_Length($mystring,
- Zend_Measure_Length::STANDARD,
- 'en_US');
- echo $unit; // Ausgabe "1234.50 m"
- ]]></programlisting>
- </example>
- <para>
- Seit Zend Framework 1.7.0 unterstützt <classname>Zend_Measure</classname> auch die
- Verwendung eines Anwendungsweiten Gebietsschemas. Man kann ganz einfach eine
- <classname>Zend_Locale</classname> Instanz in der Registry setzen wie anbei gezeigt. Mit
- dieser Schreibweise kann man das manuelle Setzen eines Gebietsschemas für jede Instanz
- vergessen wenn man das selbe Gebietsschema mehrere Male verwenden will.
- </para>
- <programlisting language="php"><![CDATA[
- // In der Bootstrap Datei
- $locale = new Zend_Locale('de_AT');
- Zend_Registry::set('Zend_Locale', $locale);
- // Irgendwo in der eigenen Anwendung
- $length = new Zend_Measure_Length(Zend_Measure_Length::METER();
- ]]></programlisting>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|