2010-12-14 28 views
1

Je suis complètement novice dans le développement de l'objectif C/iPad, mais j'essaie de construire une simple calculatrice à quatre fonctions sur l'iPad.Afficher le point décimal avec NSString stringWithFormat dans l'objectif C

Ma plus grande difficulté actuelle est simplement d'afficher un . lorsque le bouton décimal est enfoncé. Voici ce qui se passe quand un bouton (comme deux) est pressé.

-(IBAction)inTwo:(id)sender { 
    display = display*10+2; 
    [resultfield setText:[NSString stringWithFormat:@"%f",display]];  
} 

Essayer de le faire

display = display*10+. 

est évidemment ne fonctionne pas. Un moyen d'ajouter une période à la fin de l'affichage?

Merci

+0

Pour formater des nombres en sortie, vous devez généralement utiliser un NSNumberFormatter. –

+1

Il suffit de l'insérer dans le 'resultfield', puis de l'exécuter via mon DDMathParser: http://github.com/davedelong/DDMathParser –

Répondre

0
resultfield.text = [result.text stringByAppendingString:@"."]; 

Vous ne pouvez pas ajouter un point à display bien, puisque ce n'est pas une chaîne.

1

Si vous voulez juste pour l'afficher, vous pouvez le faire:

[resultField setText:[NSString stringWithFormat:@"%f%@", display, @"."]]; 

Ensuite, dans vos autres méthodes, ont les vérifier pour voir s'il y a un point décimal avant d'ajouter:

-(IBAction)inTwo:(id)sender { 
    if([resultField.text rangeOfString:@"."] == NSNotFound) { 
     display = display*10+2; 
     [resultfield setText:[NSString stringWithFormat:@"%f",display]]; 
    } 
    else { 
     display += 2/10 * (resultField.length - [resultField.text rangeOfString:@"."] +1) 
     [resultfield setText:[NSString stringWithFormat:@"%f",display]]; 
    } 
} 

Ce que vous faites ici est d'abord de vérifier s'il y a un point décimal pour voir si vous devriez ajouter le chiffre à l'endroit ou à la droite de la décimale. S'il y a un point décimal, nous ajoutons le chiffre divisé par dix fois la différence entre l'emplacement de la décimale et la longueur de la chaîne entière.

0

Vous avez seulement manqué un peu:

[resultfield setText:[NSString stringWithFormat:@"%f.", display]]; 

Si pour une raison quelconque l'analyseur identifie la virgule après le% f comme une sorte de spécificateur sur la précision du flotteur ou quelque chose (faire ne presque pas positif), échapper à tout point décimal:

[resultfield setText:[NSString stringWithFormat:@"%f\.", display]]; 
0

je le ferais un peu différemment de la façon dont vous avez choisi. Je voudrais que les boutons mettent à jour l'affichage directement et convertissent seulement en nombre quand nécessaire pour le calcul.

par exemple.

-(IBAction)inTwo:(id)sender 
{ 
    NSString* displayedText = [resultField text]; 
    [resultfield setText:[NSString stringByAppendingString: @"2"]]; 
} 

-(IBAction)inDecimal:(id)sender 
{ 
    if (![self isDecimalAlreadyPressed]) // only allowed one decimal in the number 
    { 
     NSString* displayedText = [resultField text]; 
     [resultfield setText:[NSString stringByAppendingString: @"."]]; // actually want the localised character really 
     [self setDecimalAlreadyPressed: YES]; 
    } 
} 

Puis, quand vous avez besoin de calculer quelque chose:

-(double) displayAsDouble 
{ 
    NSDecimalNumber* displayAsDecimal = [NSDecimalNumber decimalNumberWithString: [resultField text]]; 
    return [displayAsDecimal doubleValue]; 
} 

Par ailleurs, envisager de laisser le numéro comme un NSDecimalNumber. Il y a des méthodes sur NSDecimalNumber pour faire de l'arithmétique simple et elles fonctionnent en base 10, donc vous pouvez les utiliser et éviter beaucoup de problèmes de représentation avec des nombres à virgule flottante.