J'utilise FormattedNumber de React Intl dans un grand projet React capable de prendre en charge de nombreuses langues.
Voici un composant devise que j'ai créé afin de pouvoir facilement insérer une devise formatée dans mes vues:
import {FormattedNumber} from 'react-intl';
const Currency = (props) => {
const currency = props.currency;
const minimum = props.minimumFractionDigits || 2;
const maximum = props.maximumFractionDigits || 2;
return <FormattedNumber
value={props.amount}
style="currency"
currency={currency}
minimumFractionDigits={minimum}
maximumFractionDigits={maximum}
/>;
};
export default Currency;
Le composant fonctionne très bien. Et cela fonctionne comme prévu. En anglais - lorsque currency
est GBP
- un montant est formaté de la manière suivante:
£4.00
En allemand - lorsque currency
est EUR
- son format est le suivant:
4,00€
Cependant, je dois formater le montant différemment dans un cas particulier. Donc, ce que je recherche, c’est l’euro qui précède le montant, comme suit:
€4,00
Est-ce possible avec FormattedNumber? Je ne veux pas avoir à reformater manuellement le nombre formaté si je peux l'éviter.
Vous pouvez envelopper votre FormattedNumber
avec un composant IntlProvider
avec les propriétés locales appropriées, comme ceci:
<IntlProvider locale='en'>
<FormattedNumber
value={props.amount}
style="currency"
currency={props.currency} />
</IntlProvider>
Peut-être que le fichier 'en' n'est pas toujours le bon, car il utilisera un point au lieu d'une virgule, mais vous pouvez rechercher un paramètre régional ( voir ici ) qui fournit le format correct ou simplement en écrire un vous-même. (pour rester simple en copiant les paramètres régionaux et en remplaçant le point par la virgule dans la ligne respective).
Vous pouvez spécifier un format personnalisé, nommé, via la propriété formats
sur <IntlProvider>
. Il y a aussi defaultFormats
qui sont utilisés avec defaultLocale
dans le cas de repli, parce que formats
pourrait dépendre de locale
. Voici un exemple avec <FormattedMessage>
et <FormattedNumber>
utilisant un format de nom nommé personnalisé USD
:
const formats = {
number: {
TRY: {
style: 'currency',
currency: 'TRY'
},
USD: {
style: 'currency',
currency: 'USD'
}
}
};
<IntlProvider locale='en' messages={{
price: 'This product costs {price, number, USD}'
}}
formats={formats}
defaultFormats={formats}
>
<FormattedMessage id={'price'} values={{price: 1000}}/>
<FormattedNumber value={1000} format='USD'/>
</IntlProvider>