1 votes

intValue n'a pas de décimales

J'ai un prix que je dois convertir en fonction de la devise sélectionnée.

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"currency.plist"];
NSDictionary *plistDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain];

int price = [price intValue];
int currencyValue = [[plistDictionary valueForKey:@"EUR"] intValue];
int convertedCurrency = (price / currencyValue);

price est un NSNumber et le valueForKey est également un numéro provenant d'un fichier plist que j'ai configuré avec les taux de conversion.

Le problème que j'ai, c'est que mon price il manque les décimales. Chaque fois que je récupère la valeur intValue du prix, elle est simplement arrondie vers le haut ou vers le bas. Le même problème existe pour le taux de change que j'obtiens de la plist.

J'ai examiné NSNumberFormatter mais il ne me laisse pas setFormat pour le NSNumberFormatter. Un conseil, s'il vous plaît ?

3voto

fbrereto Points 21711

int est un type entier - par définition, il n'a pas de valeur décimale. Essayez plutôt :

float fprice = [price floatValue];
float currencyValue = [[plistDictionary valueForKey:@"EUR"] floatValue];
float convertedCurrency = (fprice / currencyValue);

2voto

Philippe Leybaert Points 62715

intValue renvoie un nombre entier, qui (par définition) est arrondi à un nombre sans décimales.

Vous pourriez utiliser doubleValeur qui renvoie un double (qui contient la partie fractionnaire) ou Valeur décimale qui renvoie un objet NSDecimal.

1voto

bwinton Points 990

Prenez la chaîne de prix et enlevez le point. Ensuite, convertissez la NSString en int, ce qui signifie que vous obtenez 4235 pennies (ou 42 dollars et 35 cents). (Assurez-vous également que la chaîne de prix que vous obtenez comporte deux décimales ! Certaines personnes sont paresseuses et sortent "3.3" pour "$3.30").

NSString *removePeriod = [price stringByReplacingOccurrencesOfString:@"." withString:@""];
int convertedPrice = [removePeriod intValue];
float exchangeRate;

Obtenez ensuite les taux de change en fonction de la devise sélectionnée et utilisez le code suivant :

int convertedCurrency = round((double)convertedPrice / exchangeRate);
addCurrency = [NSString stringWithFormat: @"%0d.%02d", (convertedCurrency / 100), (convertedCurrency % 100)];

addCurrency est votre prix final.

0voto

Mark Points 21191

Pour traiter le nombre exact de décimales et si toutes vos devises ont 2 décimales (par exemple pas le JPY), faites en sorte que tous les nombres soient en centimes. par exemple, enregistrez 43,35 EUR comme 4235.

Vous pouvez ensuite l'utiliser dans l'arithmétique et vous occuper du formatage en utilisant la valeur/100.0 et NSNumberFormatter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X