PHP 5.6.0beta1 released

La classe NumberFormatter

(PHP 5 >= 5.3.0, PECL intl >= 1.0.0)

Introduction

Les programmes stockent et manipulent des nombres en utilisant une représentation locale, binaire et indépendante. Lors de l'affichage d'un nombre, il est converti en une version particulière. Par exemple, un nombre tel que 12345.67 s'écrit "12,345.67" aux USA, "12 345,67" en France et "12.345,67" en Allemagne.

En appelant les méthodes fournies par NumberFormatter, vous pouvez formater les nombres, les montants de devises et les pourcentages, en fonctions des conventions locales. NumberFormatter prend en compte les conventions, ce qui fait que vous devez créer un nouvel objet NumberFormatter, pour chaque convention. Les méthodes de NumberFormatter, formatent des types primitifs comme des nombres décimaux, et produit une chaîne de caractères.

Pour les monnaies, vous pouvez utiliser le format monétaire pour créer un formateur qui retourne une chaîne, avec le symbole de devise approprié. Bien entendu, NumberFormatter ne connait pas les taux de changes, ce qui fait que l'affichage sera fait, qulelque soit la devise demandée. Cela signifie que le même nombre aura différente valeur monétaires en fonction de la configuration locale. Par exemple, le nombre 9988776.65 s'affichera :

  • 9 988 776,65 € en France
  • 9.988.776,65 € en Allemagne
  • $9,988,776.65 aux USA

Pour formater des pourcentages, vous devez créer un formateur local, avec un type de format pourcentage. Avec ce formateur, une fraction décimale telle que 0.75 sera affichée 75%.

Pour des formatages plus complexes, comme des nombres écrits litéralement, des formateurs à règles sont utilisés.

Synopsis de la classe

NumberFormatter {
/* Méthodes */
public __construct ( string $locale , int $style [, string $pattern ] )
public static NumberFormatter create ( string $locale , int $style [, string $pattern ] )
public string formatCurrency ( float $value , string $currency )
public string format ( number $value [, int $type ] )
public int getAttribute ( int $attr )
public int getErrorCode ( void )
public string getErrorMessage ( void )
public string getLocale ([ int $type ] )
public string getPattern ( void )
public string getSymbol ( int $attr )
public string getTextAttribute ( int $attr )
public float parseCurrency ( string $value , string &$currency [, int &$position ] )
public mixed parse ( string $value [, int $type [, int &$position ]] )
public bool setAttribute ( int $attr , int $value )
public bool setPattern ( string $pattern )
public bool setSymbol ( int $attr , string $value )
public bool setTextAttribute ( int $attr , string $value )
}

Constantes pré-définies

Ces styles sont utilisés par numfmt_create() pour définir le type de formatteur.

NumberFormatter::PATTERN_DECIMAL (entier)
Format décimal défini par un modèle
NumberFormatter::DECIMAL (entier)
Format décimal
NumberFormatter::CURRENCY (entier)
Format monétaire
NumberFormatter::PERCENT (entier)
Format pourcentage
NumberFormatter::SCIENTIFIC (entier)
Format scientifique
NumberFormatter::SPELLOUT (entier)
Format littéral, basé sur des règles
NumberFormatter::ORDINAL (entier)
Format ordinal, basé sur des règles
NumberFormatter::DURATION (entier)
Format de durée, , basé sur des règles
NumberFormatter::PATTERN_RULEBASED (entier)
Format de modèle, , basé sur des règles
NumberFormatter::DEFAULT_STYLE (entier)
Format par défaut pour les conventions locales
NumberFormatter::IGNORE (entier)
Alias de PATTERN_DECIMAL

Ces constantes définissent la méthode d'analyse et de formattage des nombres. Ils doivent être utilisés comme arguments des fonctions numfmt_format() et numfmt_parse().

NumberFormatter::TYPE_DEFAULT (entier)
Dérive le type depuis le type de variable
NumberFormatter::TYPE_INT32 (entier)
Formate / analyse un entier 32 bits
NumberFormatter::TYPE_INT64 (entier)
Formate / analyse un entier 64 bits
NumberFormatter::TYPE_DOUBLE (entier)
Formate / analyse un nombre décimal
NumberFormatter::TYPE_CURRENCY (entier)
Formate / analyse une valeur monétaire

Attributs de formats de nombre utilisés par numfmt_get_attribute() et numfmt_set_attribute().

NumberFormatter::PARSE_INT_ONLY (entier)
Analyse uniquement les entiers.
NumberFormatter::GROUPING_USED (entier)
Séparateur de groupes.
NumberFormatter::DECIMAL_ALWAYS_SHOWN (entier)
Affiche toujours une virgule décimale.
NumberFormatter::MAX_INTEGER_DIGITS (entier)
Nombre maximal de chiffres.
NumberFormatter::MIN_INTEGER_DIGITS (entier)
Nombre minimale de chiffres.
NumberFormatter::INTEGER_DIGITS (entier)
Nombre de chiffres.
NumberFormatter::MAX_FRACTION_DIGITS (entier)
Nombre maximal de décimales.
NumberFormatter::MIN_FRACTION_DIGITS (entier)
Nombre minimal de décimales.
NumberFormatter::FRACTION_DIGITS (entier)
Nombre de décimales.
NumberFormatter::MULTIPLIER (entier)
Multiplicateur.
NumberFormatter::GROUPING_SIZE (entier)
Taille de regroupement.
NumberFormatter::ROUNDING_MODE (entier)
Mode d'arrondi.
NumberFormatter::ROUNDING_INCREMENT (entier)
Incrément d'arrondi.
NumberFormatter::FORMAT_WIDTH (entier)
La largeur de complément pour le formattage d'un nombre.
NumberFormatter::PADDING_POSITION (entier)
La position à laquelle le complément se fait. Voyez les constantes de complément pour avoir les différentes valeurs possibles.
NumberFormatter::SECONDARY_GROUPING_SIZE (entier)
Taille secondaire de groupement.
NumberFormatter::SIGNIFICANT_DIGITS_USED (entier)
Utilise les chiffres significatifs.
NumberFormatter::MIN_SIGNIFICANT_DIGITS (entier)
Nombre minimum de chiffres significatifs.
NumberFormatter::MAX_SIGNIFICANT_DIGITS (entier)
Nombre maximum de chiffres significatifs.
NumberFormatter::LENIENT_PARSE (entier)
Mode d'analyse utilisé par les formats à règles.

Attributs de texte pour les formats de nombres, utilisés par numfmt_get_text_attribute() et numfmt_set_text_attribute().

NumberFormatter::POSITIVE_PREFIX (entier)
Préfixe positif.
NumberFormatter::POSITIVE_SUFFIX (entier)
Suffise positif.
NumberFormatter::NEGATIVE_PREFIX (entier)
Préfixe négatif.
NumberFormatter::NEGATIVE_SUFFIX (entier)
Suffixe négatif.
NumberFormatter::PADDING_CHARACTER (entier)
Le caractère à utiliser pour compléter les formats jusqu'à la taille.
NumberFormatter::CURRENCY_CODE (entier)
Le code de devise ISO.
NumberFormatter::DEFAULT_RULESET (entier)
Le jeu de règles par défaut. Il est uniquement utilisable avec les formatteurs à règles.
NumberFormatter::PUBLIC_RULESETS (entier)
Le jeu de règles publiques. Ceci est uniquement disponible avec les formatteurs à règles. C'est un attribut en lecture seule. Les règles publiques sont retournées sous forme d'une seule chaîne, et chaque règle est délimitée par un point-virgule ';'.

Les symboles de format utilisés par numfmt_get_symbol() et numfmt_set_symbol().

NumberFormatter::DECIMAL_SEPARATOR_SYMBOL (entier)
Le séparateur décimal.
NumberFormatter::GROUPING_SEPARATOR_SYMBOL (entier)
Le séparateur de groupes.
NumberFormatter::PATTERN_SEPARATOR_SYMBOL (entier)
Le modèle de séparateur.
NumberFormatter::PERCENT_SYMBOL (entier)
Le signe de pourcentage.
NumberFormatter::ZERO_DIGIT_SYMBOL (entier)
Zéro.
NumberFormatter::DIGIT_SYMBOL (entier)
Un caractère représentant un chiffre dans un modèle.
NumberFormatter::MINUS_SIGN_SYMBOL (entier)
Le signe moins.
NumberFormatter::PLUS_SIGN_SYMBOL (entier)
Le signe plus.
NumberFormatter::CURRENCY_SYMBOL (entier)
Le symbole de devise.
NumberFormatter::INTL_CURRENCY_SYMBOL (entier)
Le symbole international de devise.
NumberFormatter::MONETARY_SEPARATOR_SYMBOL (entier)
Le séparateur monétaire.
NumberFormatter::EXPONENTIAL_SYMBOL (entier)
Le symbole d'exponentiel.
NumberFormatter::PERMILL_SYMBOL (entier)
Le symbol par mille.
NumberFormatter::PAD_ESCAPE_SYMBOL (entier)
Le caractère de protection des symboles.
NumberFormatter::INFINITY_SYMBOL (entier)
Le symbole de l'infini.
NumberFormatter::NAN_SYMBOL (entier)
Le symbole "n'est pas un nombre".
NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL (entier)
Le symbole des chiffres significatifs.
NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL (entier)
Le séparateur de groupes monétaires.

Les modes d'arrondi utilisés par les fonctions numfmt_get_attribute() et numfmt_set_attribute() avec l'attribut NumberFormatter::ROUNDING_MODE.

NumberFormatter::ROUND_CEILING (entier)
Mode d'arrondi vers l'infini positif.
NumberFormatter::ROUND_DOWN (entier)
Mode d'arrondi vers zéro.
NumberFormatter::ROUND_FLOOR (entier)
Mode d'arrondi vers l'infini négatif.
NumberFormatter::ROUND_HALFDOWN (entier)
Mode d'arrondi vers le plus proche entier, a moins qu'ils soient équidistants : arrondi inférieur dans ce cas.
NumberFormatter::ROUND_HALFEVEN (entier)
Mode d'arrondi vers le plus proche entier, a moins qu'ils soient équidistants : arrondi vers le nombre pair dans ce cas.
NumberFormatter::ROUND_HALFUP (entier)
Mode d'arrondi vers le plus proche entier, a moins qu'ils soient équidistants : arrondi supérieur dans ce cas.
NumberFormatter::ROUND_UP (entier)
Mode d'arrondi qui éloigne de zéro.

Valeurs de compléments utilisés par numfmt_get_attribute() et numfmt_set_attribute() avec l'attribut NumberFormatter::PADDING_POSITION.

NumberFormatter::PAD_AFTER_PREFIX (entier)
Caractères de compléments ajoutés après le préfixe.
NumberFormatter::PAD_AFTER_SUFFIX (entier)
Caractères de compléments ajoutés après le suffixe.
NumberFormatter::PAD_BEFORE_PREFIX (entier)
Caractères de compléments ajoutés avant le préfixe.
NumberFormatter::PAD_BEFORE_SUFFIX (entier)
Caractères de compléments ajoutés avant le suffixe.

Sommaire

add a note add a note

User Contributed Notes 2 notes

up
5
giorgio dot liscio at email dot it
3 years ago
this class seems to be painful: it is not, formatting and parsing are highly customizable, but what you probably need is really simple:

if you want to localize a number use:

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::DECIMAL);
echo
$a->format(12345.12345) . "<br>"; // outputs 12.345,12
$a->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0);
$a->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 100); // by default some locales got max 2 fraction digits, that is probably not what you want
echo $a->format(12345.12345) . "<br>"; // outputs 12.345,12345
?>

if you want to print money use:

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo
$a->format(12345.12345) . "<br>"; // outputs €12.345,12
?>

if you have money data stored as (for example) US dollars and you want to print them using the it-IT notation, you need to use

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo
$a->formatCurrency(12345, "USD") . "<br>"; // outputs $ 12.345,00 and it is formatted using the italian notation (comma as decimal separator)
?>

another useful example about currency (how to obtain the currency name by a locale string):

<?php
$frontEndFormatter
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
$adminFormatter = new \NumberFormatter("en-US", \NumberFormatter::CURRENCY);
$symbol = $adminFormatter->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL); // got USD
echo $frontEndFormatter->formatCurrency(12345.12345$symbol) . "<br>";
?>
up
0
sudheer at binaryvibes dot co dot in
3 years ago
Sample script to print number in English.

<?php
$f
= new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo
$f->format(123456);

?>

Produces the result:
one hundred twenty-three thousand four hundred fifty-six
To Top