2009-12-28 11 views
2

voici mon code snip, je ne sais pas comment arrondir les nombres doubles.NSNumberFormatter et arrondi pourcentage valeur

double m = [tmpProduct.msrp doubleValue] ; 
double d = [tmpProduct.discountPrice doubleValue]; 
double p = (d * 100)/m; 

ici tmpProduct.msrp et mpProduct.discountPrice sont (NSDecimalNUmber *)

de l'opération ci-dessus, je suis p = 44,995757

je veux convertir en (45%), comment faire je fais ça?

Voici ce que j'utilise, mais cela n'aide pas.

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode: NSNumberFormatterRoundDown]; 
[formatter stringFromNumber:[NSNumber numberWithDouble:p]] 

Répondre

1

Avez-vous essayé d'utiliser les opérations arithmétiques NSDecimalNumber fournit?
Je ne l'ai pas essayé moi-même, mais il semble que vous contourniez les avantages de NSDecimalNumber en utilisant des opérateurs standard (*, /, ...) sur les valeurs doubles de vos instances de nombre.
Jetez un oeil à NSDecimalNumber: Performing Arithmetic

Comme Objective-C ne prend pas en charge la surcharge d'opérateur, vous devrez utiliser des méthodes telles que:

- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber 

Mise à jour:
Division en utilisant NSDecimalNumber:

NSDecimalNumber* operandOne = [NSDecimalNumber decimalNumberWithString:@"1234.5"]; 
NSDecimalNumber* operandTwo = [NSDecimalNumber decimalNumberWithString:@"2335"]; 
NSDecimalNumber* result = [operandOne decimalNumberByDividingBy:operandTwo]; 
NSLog(@"%@", [result descriptionWithLocale:[NSLocale currentLocale]]); 

en utilisant descriptionWithLocale:, vous obtenez le bon NSLocaleDecimalSeparator

Mise à jour 2:
J'oublièrent l'arrondissement:
NSDecimalNumber prend en charge plusieurs modes d'arrondi.
Lire la documentation de decimalNumberByRoundingAccordingToBehavior:

+0

merci pour reply.i essayé ceci NSDecimalNumber * d1 = [tmpProduct.discountPrice decimalNumberByDividingBy: tmpProduct.msrp]; mais cela me donne une exception (voici les valeurs que j'ai eu discounprice = 1234.5 et masrp est 2335) – Nnp

+0

pas de chance avec ça? – Nnp

+0

J'ai mis à jour ma réponse avec un petit exemple, qui utilise les valeurs que vous avez collé. Fonctionne bien ici. Peut-être que vous pouvez poster plus de détails? Utilisez-vous Core Data/bindings etc ...? –

1

Dans ce cas précis, je vous suggère de définir le style à NSNumberFormatterPercentStyle et les chiffres de la fraction maximale à 0. Ensuite, vous ne devriez pas avoir à vous soucier de l'arrondissement. Cela fonctionne pour moi:

double p = d/m; // note: not multiplying by 100 here 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterPercentStyle]; 
NSString *s = [formatter stringFromNumber:[NSNumber numberWithDouble:p]]; 

Cela donne la chaîne "45%".