Projet Calculatrice: cacher les décimales (.0) dans le resultat


#1

Bonsoir à tous,

Je suis actuellement sur le petit projet calculatrice et j’aimerais savoir s’il y a un moyen de cacher les décimales dans le label result, comme montré sur le screenshot

Vu qu’on utilise des variables DOUBLE c’est logique vu qu’on veut stocker des décimales pour les division par ex.

J’imagine qu’une solution doit exister, j’ai cherché un peu mais aucune ne fonctionne

Merci d’avance pour votre aide ! :slight_smile:


#2
        // Valeur flottante
        let valeur = 32.9876550
        
        // Conversion simple flottant => String
        let str1 = String(valeur)
        print ("Conversion simple : ", str1)
        
        // Conversion flottant => String
        // avec formatage du résultat
        // (On garde les 2 premières décimales)
        // (après la virgule)
        let str2 = String(format:"%.02f", valeur)
        print ("Conversion avec 2 chiffres après la virgule : ", str2)
        
        // Conversion flottant => String
        // avec un formatage ne conservant
        // qu'un chiffre après la virgule
        let str3 = String(format:"%.01f", valeur)
        print ("Conversion avec 1 chiffre après la virgule : ", str3)

Conversion simple : 32.987655

Conversion avec 2 chiffres après la virgule : 32.99

Conversion avec 1 chiffre après la virgule : 33.0


#3

Merci bien pour ta réponse.

J’ai cependant un peu de mal à visualiser l’implémentation de ton code dans le projet calculatrice, valeur correspond au résultat de l’opération ?


#4

Salut, @Axelitos

Sinon, j’ai trouvé ça sur stackoverflow.

var distanceFloat1: Float = 5.0
var distanceFloat2: Float = 5.540
var distanceFloat3: Float = 5.03

extension Float {
    var clean: String {
       return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
    }
}

print("Value \(distanceFloat1.clean)") // 5
print("Value \(distanceFloat2.clean)") // 5.54
print("Value \(distanceFloat3.clean)") // 5.03 

C’est une extension de Float mais, tu peut la mettre en Double ça fonctionne aussi.


#5

Salut, merci beaucoup.

Je vois le processus qui est fait pour tronquer le résultat pour ne pas afficher la décimale si il n’y a pas besoin, mais j’aimerais savoir également comment l’intégrer au projet calculatrice, j’ai essayé plusieurs solutions mais aucune ne fonctionne pour le moment.


#6

normalement tu prend la variable que tu à utilisé pour ton label résultat et tu as juste à rajouter .clean derrière (normalement tu as l’autocompletion qui doit s’afficher) et n’oublie pas de le convertir en String sinon, ça ne fonctionne pas.


#7

Je n’ai pas accès à la vidéo parlant de la calculatrice, n’ayant probablement pas acheté le cours correspondant. Montre-nous le code de ta calculatrice. Ce sera plus simple que d’expliquer des choses théoriques un peu dans le vide.


#8

viewControllerCalculatrice.zip (1,5 Ko)

Ci-joint mon code pour la calculatrice.

J’imagine que ça va ce passer dans la fonction performWaitingCalculous() qui est appelée lorsque qu’on effectue l’opération pour afficher le résultat.

Merci pour ton aide ! :slight_smile:


#9

Oui tu as juste a mettre l’extension quelque par dans ton viewController et de rajouter .clean dans le performWaitingCalculous() avec "\(result.clean)" et normalement ça devrais fonctionner.

Voici l’extension :

extension Double {
        var clean: String {
            return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
        }
    }

#10

C’est parfait !

Merci beaucoup pour votre aide à tous :smile:


#11

Attention à la solution d’Antony. Elle a un petit coté magique pour un débutant, en utilisant des fonctions de haut niveau comme les extensions, et des opérateurs mathématiques sophistiqués.

Le but d’un exercice comme la calculatrice est de permettre à un novice de manipuler des concepts simples. L’arrondi du résultat se fait avec la fonction String(format:). A mon sens, l’encapsuler dans une formule magique complexe n’aide pas à la compréhension des mécanismes de base.


#12

Voici ta fonction :

func performWaitingCalculous() {
    let result:Double
    
    if _operationType == "+" {
        result = _previousNumber + _currentNumber
        
    } else if _operationType == "-" {
        result = _previousNumber - _currentNumber
    
    } else if _operationType == "*" {
        result = _previousNumber * _currentNumber
        
    } else if _operationType == "/"{
        result = _previousNumber / _currentNumber
        
    } else {
        result = _currentNumber
    }
    
    _previousNumber = result
    _shouldResetCurrentnumber = true
    
    resultLabel.text = "\(result)"
}

L’affichage du résultat se fait avec cette ligne :

    resultLabel.text = "\(result)"

Deux opérations s’y produisent :

  • une conversion Double => String
  • l’affectation du résultat de la conversion au Label Text

La conversion est nécessaire parce que le composant graphique Label ne peut afficher que des chaînes de caractères (des textes).

La conversion Double=>String peut aussi se faire avec l’opérateur String.

resultLabel.text = String(result)

qui existe en plusieurs variantes, dont l’une permet de formater le résultat.

// Arrondi à un chiffre après la virgule
resultLabel.text = String(format:"%.01f", result)

Le résultat est plus “rustique” que la solution d’Anthony, mais c’est plus simple à comprendre pour un novice.