2009-07-11 4 views
18

Comment puis-je obtenir la conversion suivante de la double à une chaîne:Limite double à deux décimales

1.4324 => "1.43" 
9.4000 => "9.4" 
43.000 => "43" 

-à-dire que je veux arrondir à décimales, mais ne veux pas des zéros, ce que je ne veux pas

9.4 => "9.40" (wrong) 
43.000 => "43.00" (wrong) 

donc, ce code que je ne fonctionne plus car il affiche des zéros en excès:

[NSString stringWithFormat: @"%.2f", total] 
+1

Ce n'est pas un double de http://stackoverflow.com/questions/4985791/round-double-value-to-2-decimal-places donc je pense qu'il devrait être non marqué comme dupliquer. Cette question est sur la façon de limiter à un * maximum * de deux décimales tandis que l'autre question est de savoir comment limiter à * toujours * deux décimales. Ce dernier est facile et déjà mentionné dans la question originale. –

+0

Oui, ce n'est pas un doublon. Quelqu'un juste excité au sujet de leurs pouvoirs de mod. – Jacob

Répondre

1

Je ne suis pas familier avec l'objectif C, mais ce n'est pas possible avec le format standard de style printf. Utiliser% g fonctionnerait en tri, mais pour les grands ou petits nombres, il utiliserait la notation scientifique (par exemple 9.6e + 6, 4.2e-7) plutôt que la notation décimale.

Le equivalent question was asked for C/C++ here, et dans ce cas, la réponse est d'utiliser% f, puis de supprimer les 0 à la fin de la chaîne. Pas vraiment élégant.

+0

Hé, c'était ma réponse que vous appelez inélégante :-) En fait, c'est beaucoup plus élégant en Objective-C puisque les chaînes sont en fait des chaînes plutôt que des tableaux C char avec toutes leurs faiblesses. – paxdiablo

4

La façon la plus simple est probablement de rouler la vôtre. J'ai dû faire ceci en C avant car il n'y a aucun moyen d'obtenir le comportement que vous voulez avec le formatage printf.

Cela ne semble pas non plus beaucoup plus facile en Objective-C. Je donnerais cette solution:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total]; 
while ([ftotal hasSuffix:@"0"]) { 
    ftotal = [ftotal subStringToIndex [ftotal length]-1]; 
} 
if ([ftotal hasSuffix:@"."]) { 
    ftotal = [ftotal subStringToIndex [ftotal length]-1]; 
} 

ou ce (peut-être plus rapide) variante:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total]; 
if ([ftotal hasSuffix:@".00"]) { 
    ftotal = [ftotal subStringToIndex [ftotal length]-3]; 
} else { 
    if ([ftotal hasSuffix:@"0"]) { 
     ftotal = [ftotal subStringToIndex [ftotal length]-1]; 
    } 
} 

Les stringWithFormat garanties, il y aura toujours un ".nn" à la fin (où n est un caractère de chiffres) . Les while et if suppriment simplement les zéros de fin et la virgule flottante s'il s'agit d'un nombre entier.

Évidemment, vous voudrez peut-être le mettre dans une fonction ou une classe afin que vous puissiez y accéder de n'importe où sans avoir à dupliquer le code partout.

-2

Je suis assez sûr que [[NSNumber numberWithFloat: f] stringValue] fait exactement ce que vous voulez.

35

Vous avez fait une erreur simple. Cela fonctionne:

[NSString stringWithFormat: @"%.2lf", total] 
+7

Cela fonctionne, mais comment? – Beniamin