0

J'essaye de formater une valeur monétaire avec CurrencyFormat de Zend (en utilisant ICU). Fondamentalement, cela fonctionne - le modèle #,##0.# produit un format correct comme 1.200,00 €.Comment formater une valeur monétaire avec ICU masquant les unités mineures si zéro

Est-il possible d'omettre la partie d'unité mineure si elle est zéro simplement en modifiant le motif? Je veux avoir les résultats suivants: mise en forme

  • 1.200 € si les unités sont mineures « .00"
  • 1.200,34 € si minour unités ne sont pas » .00"

Répondre

1

Je ne pense pas que ce soit possible de le réaliser en modifiant le motif. Je veux dire, vous pouvez vérifier si le numéro fourni est de type float ou int. Si c'est int vous pouvez définir un modèle différent, mais il existe un moyen plus simple (plus recommandé façon IMO).
Le 3ème argument de la méthode __invoke() est $showDecimal. Cela prend une valeur booléenne. Si vous voulez que les décimales soient visibles, passez true (sa valeur par défaut), false sinon.

Exemple
true - si le nombre est un nombre entier

<?php echo $this->currencyFormat(1234, "EUR", true, "de_DE"); ?> 

sortie:

1.234,00 €

false - si le numéro est flotter

<?php echo $this->currencyFormat(1234, "EUR", false, "de_DE"); ?> 

Sortie:

1.234 €

exemple boucle

// $prices = [1234, 1234.23, 234, 3456.54] 
<?php foreach($prices as $price): ?> 
    <?php $showDecimal = is_float($price) ? true : false; 
    <p><?php echo $this->currencyFormat(1234, "EUR", $showDecimal, "de_DE"); ?></p> 
<?php endforeach; ?> 

mondial
Si pour une raison quelconque, vous voulez cacher des nombres décimaux pour toutes les monnaies/formats, vous pouvez utiliser setShouldShowDecimals() méthode :

$this->plugin("currencyformat")->setShouldShowDecimals(false)->setCurrencyCode("USD")->setLocale("en_US"); 

echo $this->currencyFormat(1234.00); // "$1,234" 

Voici une liste de tous les symboles disponibles pour le motif http://www.icu-project.org/apiref/icu4c/classDecimalFormat.html#details

+0

Merci pour votre réponse. J'ai déjà fait quelques tests avec le paramètre '$ showDecimal', mais malheureusement, ce n'est qu'un" off-for-all-cases "ou" on-for-all-cases ". En ce moment, je remplace la chaîne ", 00" avec une chaîne vide. Pas sympa mais au moins ça marche. – acme

+0

J'ai modifié mon message. Je ne sais pas à quoi ressemblent vos données, mais ne pouvez-vous pas vérifier si le nombre a des décimales comme dans mon "exemple de boucle"? Je pense qu'il serait plus élégant d'utiliser alors 'str_replace' – SzymonM

+0

Le prix est défini en unités mineures (par exemple 123456 est 1234,56 $ à la fin). Donc je suppose que la seule façon est de vérifier si elle se termine par "00" et de mettre '$ showDecimal' en conséquence ou juste de remplacer" .00 "par une chaîne vide à la fin. – acme