En créant un objet de mesure, les méthodes Zend_Measure_*
prévoient que l'entrée ou la mesure originale soit le premier paramètre. Ceci peut être un argument numérique
, une chaîne
sans unités, ou une chaîne régionale
avec une (des) unité(s) spécifiée(s). Le deuxième paramètre définit le type de la mesure. Les deux paramètres sont obligatoires. La langue peut être indiquée comme troisième paramètre optionel.
En plus des valeurs de données en nombre entier, des nombre décimaux peuvent être employés, mais "il est fréquent que de simples fractions décimales telles que 0.1 ou 0.7 ne puissent être converties au format interne binaire sans une légère perte de précision" parfois en donnant des résultats étonnants. En outre, il ne faut pas comparer l'égalité de deux nombres décimaux.
Exemple 21.3. Création de mesure en utilisant des nombres entiers et décimaux
<?php require_once 'Zend/Measure/Length.php'; $mesure = 1234.7; $unite = new Zend_Measure_Length((integer)$mesure, Zend_Measure_Length::STANDARD); echo $unite; // affiche '1234 m' (mètres) $unite = new Zend_Measure_Length($mesure, Zend_Measure_Length::STANDARD); echo $unite; // affiche '1234.7 m' (mètres) ?>
Beaucoup de mesures reçues comme entrée des applications ZF peuvent seulement être passées aux classes Zend_Measure_*
comme des chaînes, telles que des nombres écrits en utilisant les chiffres romains ou les valeurs binaires extrêmement grandes qui excèdent la précision native de PHP des nombres entiers ou décimaux. Puisque les nombres entiers peuvent être indiqués en utilisant des chaînes, s'il y a un quelconque risque de perdre la précision à cuase des limitations des types natifs (nombre entier et décimaux), il faut utiliser des chaînes à la place. Zend_Measure_Number
emploie l'extension BCMath pour supporter la précision arbitraire, afin d'éviter les limitations dans beaucoup de fonctions de PHP, telle que bin2dec()
.
Exemple 21.4. Céation de mesure en utilisant des chaînes
<?php require_once 'Zend/Measure/Number.php'; $machaine = "10010100111010111010100001011011101010001"; $unit = new Zend_Measure_Number($machaine, Zend_Measure_Number::BINARY); echo $unit; ?>
Habituellement, Zend_Measure_*
peut automatiquement extraire la mesure désirée incluse dans une chaîne arbitraire. Seulement le premier nombre identifiable, indiqué en utilisant les chiffres européens/latins standard (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), sera employé pour la création de la mesure. S'il y a des chiffres plus loin dans la chaîne, ceux-ci seront ignorés.
Exemple 21.5. Saisie de texte arbitraire contenant des mesures
<?php require_once 'Zend/Measure/Area.php'; $machaine = "Ma maison a une superficie de 125m²."; $unite = new Zend_Measure_Area($machaine, Zend_Measure_Area::STANDARD); echo $unite; // affiche "125 m²"; $machaine = "Ma maison a une superficie de 125m², elle comprend 5 pièces de 25m² chacune."; $unite = new Zend_Measure_Area($machaine, Zend_Measure_Area::STANDARD); echo $unite; // affiche "125 m² in size"; ?>
Quand une corde est présentée dans une notation régionalisée, l'interprétation correcte ne peut pas être déterminée sans connaître la région attendue. La division des chiffres décimaux avec "." et grouper des milliers avec "," est commun en l'anglais, mais pas dans d'autres langues. Par exemple, le nombre anglais "1,234.50" serait interprété comme "1.2345" en allemand. Pour traiter de tels problèmes, la famille des classes Zend_Measure_*
offrent la possibilité d'indiquer une langue ou une région pour lever l'ambiguïté les données d'entrée et pour interpréter correctement la valeur sémantique prévue.
Exemple 21.6. Localized string
<?php require_once 'Zend/Measure/Length.php'; $locale = new Zend_Locale('de'); $machaine = "The boat is 1,234.50 long."; $unite = new Zend_Measure_Length($machaine, Zend_Measure_Length::STANDARD, $locale); echo $unite; // affiche "1.234 m" $machaine = "The boat is 1,234.50 long."; $unite = new Zend_Measure_Length($machaine, Zend_Measure_Length::STANDARD, 'en_US'); echo $unite; // affiche "1234.50 m" ?>