Comparaison d'un double ou Float avec 0

Bonjour,
J'ai un petit souci pour comparer une donnée avec Zéro
je m'explique : Je récupère une donnée en string comme cela : "-0,40%" et je voudrais la comparer avec 0 pour savoir si c'est plus grand ou plus petit.
J'ai essayé pas mal de choses mais sans grand succès.
quelle méthode employez-vous

Réponses

  • klogklog Membre
    avril 2018 modifié #2

    Ca depend :
    1) Si le format de ta chaine est toujours le même, tu extrait la valeur réelle de la chaine (en supprimant préalablement le symbole "%", les espaces éventuels et en remplaçant "," par ".") par les fonctions standards du C/C++ (strtod par exemple).
    2) Si le format est localisé, je te conseille d'utiliser un NSNumberFormatter avec le style NSNumberFormatterPercentStyle.

  • Je vais juste de trouver la solution et effectivement çà donne :

    exemple : texte = "-0,40%"

    func couleurTextePC(texte: String) -> String {
    // Transformation des Valeurs
    var couleurTexte: String = ""
    let txt = String(describing: texte)
    var vei = txt.replacingOccurrences(of: "%", with: "")
    vei = vei.replacingOccurrences(of: ",", with: ".")
    let valeur01 = Float(vei)
    if valeur01! < 0 {
    couleurTexte = "red"
    } else if valeur01! > 0 {
    couleurTexte = "green"
    } else {
    couleurTexte = "black"
    }
    return couleurTexte
    }

    Désolé, je n'arrive pas à bien l'afficher.

  • klogklog Membre

    @Patyom a dit :
    Désolé, je n'arrive pas à bien l'afficher.

    Pour formater le code de ton post, encapsule ton code avec la balise ```
    Ça donne cela :

    func couleurTextePC(texte: String) -> String {
      // Transformation des Valeurs
      var couleurTexte: String = ""
      let txt = String(describing: texte)
      var vei = txt.replacingOccurrences(of: "%", with: "")
      vei = vei.replacingOccurrences(of: ",", with: ".")
      let valeur01 = Float(vei)
      if valeur01! < 0 {
        couleurTexte = "red"
      } else if valeur01! > 0 {
        couleurTexte = "green"
      } else {
        couleurTexte = "black"
      }
      return couleurTexte
    }
    

    Je ne pense pas que la coloration syntaxique en fonction du langage soit dispo dans le forum.

  • Je comprends même pas le but de la fonction... Pour moi "couleurTextePC" n'est pas un bon nom de fonction désignant une action... Pour moi c'est d'avantage le nom d'une propriété.

  • Il serait plus "simple" d'utiliser NumberFormatter comme l'a souligné klog (en faisant attention aux Locale).

    let formatter = NumberFormatter()
    formatter.numberStyle = .percent
    let number = formatter.number(from: "-0,40%")
    
  • Joanna CarterJoanna Carter Membre, Modérateur
    avril 2018 modifié #7

    Beaucoup plus correct, tu peux utiliser le code suivant :

    enum TextColourError: Error
    {
      case invalidInputString
    }
    
    extension String
    {
      func couleurPosNeg() throws -> UIColor
      {
        let numberString = self.trimmingCharacters(in: CharacterSet.decimalDigits.union(CharacterSet(charactersIn: "-")).inverted)
    
        let formatter = NumberFormatter()
    
        formatter.locale = Locale(identifier: "fr_FR")
    
        guard let value = formatter.number(from: numberString)?.doubleValue else
        {
          throw TextColourError.invalidInputString
        }
    
        switch value
        {
          case _ where value < 0:
            return .red
          case _ where value > 0:
            return .green
          default:
            return .black
        }
      }
    }
    
    {
      let valueString = "-0,40%"
    
      do
      {
        let couleur = try valueString.couleurPosNeg()
    
        print(String(describing: couleur))
      }
      catch
      {
        print("fail")
      }
    }
    
    
  • Joanna CarterJoanna Carter Membre, Modérateur

    @Lexxis a dit :
    Il serait plus "simple" d'utiliser NumberFormatter comme l'a souligné klog (en faisant attention aux Locale).

    let formatter = NumberFormatter()
    formatter.numberStyle = .percent
    let number = formatter.number(from: "-0,40%")
    

    Mais attention au numberStyle de .percent - ça donnera une valeur de 0,004 pour un string de "0,40%". C'est attendu ?

  • Mais attention au numberStyle de .percent - ça donnera une valeur de 0,004 pour un string de "0,40%". C'est attendu ?

    C'est suffisant, il me faut juste savoir si c'est > ou < que zéro

    Ca marche merci

  • Si le seul objectif est de déterminer si la valeur est négative, pourquoi, alors, ne pas te contenter de vérifier la présence du signe "-" dans ta chaine ?

  • et le zéro tu le traites comment dans ce cas là !

  • Au temps pour moi... J'ai pas regardé le code en détail.

Connectez-vous ou Inscrivez-vous pour répondre.