J'ai essayé de faire ma propre classe pour les devises à l'aide de la nostalgie, mais Apparemment je dois utiliser BigDecimal
(et puis à chaque fois que je l'imprimer, il suffit d'ajouter le signe $ devant elle). Quelqu'un pourrait-il svp me faire? Quelle serait la meilleure façon d'utiliser BigDecimal
s pour le Dollar, comme ça au moins, mais pas plus de 2 décimales pour le cents, etc. L'api pour BigDecimal
est énorme, et je ne sais pas les méthodes à utiliser. Aussi, BigDecimal
a une meilleure précision, mais n'est-ce pas tout perdu si elle passe à travers un double
? si je ne nouveau BigDecimal(24.99)
, comment est-il différent que d'utiliser un double
? Ou devrais-je utiliser le constructeur qui utilise un String
à la place?
EDIT: j'ai décidé d'utiliser BigDecimal
s, et ensuite utiliser:
private static final java.text.NumberFormat moneyt =
java.text.NumberFormat.getCurrencyInstance();
{
money.setRoundingMode(RoundingMode.HALF_EVEN);
}
et puis à chaque fois que j'affiche le BigDecimal
s, utiliser money.format(theBigDecimal)
. Est-ce bien? Je devrais avoir l' BigDecimal
arrondi-il trop? Parce qu'alors, il n'a pas obtenir de l'arrondi avant qu'elle ne fasse une autre opération.. si oui, pourriez-vous me montrer comment faire? Et comment dois-je créer l' BigDecimal
s? new BigDecimal("24.99")
?
Eh bien, après de nombreux commentaires de Vineet Reynolds (merci de garder de revenir et de répondre), c'est ce que j'ai décidé. J'utilise BigDecimal
s et NumberFormat
. C'est là que j'ai créer l' NumberFormat
de l'instance.
private static final NumberFormat money;
static {
money = NumberFormat.getCurrencyInstance(Locale.CANADA);
money.setRoundingMode(RoundingMode.HALF_EVEN);
}
Voici mon BigDecimal:
private final BigDecimal price;
Chaque fois que je veux afficher l' price
, ou d'une autre, BigDecimal
que j'ai obtenu grâce à des calculs de price
, j'utilise:
money.format(price)
pour obtenir l' String
. Chaque fois que je veux stocker l' price
, ou d'un calcul à partir d' price
, dans une base de données ou dans un domaine ou n'importe où, j'utilise (de champ):
myCalculatedResult = price.add(new BigDecimal("34.58")).setScale(2, RoundingMode.HALF_EVEN);
.. mais je pense que maintenant peut-être que je ne devrais pas avoir l' NumberFormat
tour, mais quand je veux afficher cela:
System.out.print(money.format(price.setScale(2, RoundingMode.HALF_EVEN);
Cette façon de s'assurer que le modèle et les choses affiché dans la vue sont les mêmes. Je ne fais pas:
price = price.setScale(2, RoundingMode.HALF_EVEN);
Car alors il serait toujours arrondis à 2 décimales et de ne pas être aussi précis dans les calculs.
Donc le tout résolu maintenant, je suppose. Mais est-il un raccourci saisissant calculatedResult.setScale(2, RoundingMode.HALF_EVEN)
de tous les temps? Tout ce que je peux penser est statique de l'importation de HALF_EVEN...
EDIT: j'ai changé mon esprit un peu, je pense que si je stocker une valeur, je ne vais pas autour d'elle, à moins que je n'ai plus d'activités à faire avec elle, par exemple, si le total final qui sera facturé à quelqu'un. Je ne tour des choses à la fin, ou chaque fois que nécessaire, et je vais encore utiliser NumberFormat
de la monnaie mise en forme, mais depuis j'ai toujours envie d'arrondi pour l'affichage, j'ai fait une méthode statique pour l'affichage:
public static String moneyFormat(BigDecimal price) {
return money.format(price.setScale(2, RoundingMode.HALF_EVEN));
}
De sorte que les valeurs stockées dans les variables ne seront pas arrondis, et je vais utiliser cette méthode pour afficher les prix.