stringToDouble qui dit mieux ?

j'ai trouvé ça :



func stringToDouble (laString: String ) -> Double {
        if laString != "" {
            //laString.characters 
            let index = laString.index(of: " ") ??
                laString.endIndex
            let stringPurgee = laString[..<index]
            let newString = String(stringPurgee)
            let leDouble = Double(newString)
            return leDouble!

C'est pas mal, mais ça ne fonctionne que dans le cas ou il y a un espace après le chiffre. Mais que un Espace....

 

A-t-on une solution qui ferait la même chose, mais dès que le test rencontre autre chose qu'un chiffre, ou la ponctuation décimale ?

 

du genre == laString.isDigit ?

Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    1. il faut créer la méthode d'une manière qu'elle puisse échouer.


     


    e.g.



    func stringToDouble(_ str: String) throws -> Double
    {
    ...
    }

    Puis, tu devrais utiliser Scanner dans la méthode :



    func stringToDouble(_ str: String) throws -> Double
    {
    guard let scanner = Scanner.localizedScanner(with: str) as? Scanner else
    {
    throw ConversionFailureError.couldNotCreateScanner
    }

    let allowedCharacters = CharacterSet.decimalDigits.union(CharacterSet(charactersIn: "-"))

    scanner.charactersToBeSkipped = allowedCharacters.inverted

    var result = 0.0

    guard scanner.scanDouble(&result) else
    {
    throw ConversionFailureError.couldNotConvert
    }

    return result
    }

    Et, pour la tester :



    {
    do
    {
    let value = try stringToDouble("This is -123,45 is a value")

    print(value)
    }
    catch ConversionFailureError.couldNotCreateScanner
    {
    print("Could not create scanner")
    }
    catch ConversionFailureError.couldNotConvert
    {
    print("Could not convert")
    }
    catch
    {
    print("unknown error")
    }
    }
  • Merci Joanna, sans douter un instant que ça marche, j'espérais une solution plus simple...


  • DrakenDraken Membre
    octobre 2017 modifié #4

    Moi je dis :


    a



    let str = "-123.87"
    let double = (str as NSString).doubleValue
    print (str, " => ", double)

    a


    Et je le prouve :


     



     


    -123.87  =>  -123.87



    a


    Il est dommage que String ne possède pas l'opérateur doubleValue de son ancêtre NSString. Heureusement une petite conversion permet de régler le problème.


  • Joanna CarterJoanna Carter Membre, Modérateur
    octobre 2017 modifié #5

    @Draken


     


    Tu peux faire :



    let str = "\(-123.45)"

    if let value = Double(str)
    {
    print(value)
    }

    Mais je crois que Gercofis voulait trouver un Double d'un String qui n'est pas nécessairement "net"


  • Joanna CarterJoanna Carter Membre, Modérateur
    octobre 2017 modifié #6

    @Gercofis


     


    Tu pourrais avoir une méthode comme :



    func stringToDouble(_ str: String) -> Double?
    {
    guard let scanner = Scanner.localizedScanner(with: str) as? Scanner else
    {
    return nil
    }

    let allowedCharacters = CharacterSet.decimalDigits.union(CharacterSet(charactersIn: "-"))

    scanner.charactersToBeSkipped = allowedCharacters.inverted

    var result = 0.0

    guard scanner.scanDouble(&result) else
    {
    return nil
    }

    return result
    }

    Mais :



    if let value = Double(str)
    {
    print(value)
    }

    ... te donnerait le même résultat avec la différence que le premier puisse se débrouiller avec les strings qui ne sont pas nets




  • @Draken


     


    Tu peux faire :



    let str = "\(-123.45)"

    if let value = Double(str)
    {
    print(value)
    }

    Mais je crois que Gercofis voulait trouver un Double d'un String qui n'est pas nécessairement "net"





    let str = " -123.87 Mangez des pommes !"
    let double = (str as NSString).doubleValue
    print (str, " => ", double)


     


     -123.87 Mangez des pommes !  =>  -123.87



  • let double = (laString as NSString).doubleValue

    Voilà  un peu ce que je cherchais, ça marche même très bien...


     


    Merci a vous deux...

  • GercofisGercofis Membre
    décembre 2017 modifié #9

    Je recherche dans ce type de sujet la liste (sur un site) des commandes ou codes qui transforme des chiffres en String ? quand on utilise "\("


     


     


     


    Pour tout dire je veux afficher le résultat d'un calcul avec 2 chiches après la virgule donc un Float (par exemple) dans un label et les chiffres après la virgule sont zappés ?


  • Joanna CarterJoanna Carter Membre, Modérateur
    NumberFormatter
  • GercofisGercofis Membre
    décembre 2017 modifié #11

    Merci Joanna, mais ce que je cherche c'est une page Web qui recense toutes les fonctions ou codes du type String("du texte"\(une valeur) avec divers formatages") Je l'ai eu mais je ne parviens pas a la retrouver...


     


    Voilà  mon code et les 2 chiffres après la virgule sont zappés:



    func formatCourant(value: Float) -> String {
        let format = NumberFormatter()
        format.numberStyle = .currency
            let resultat = format.string(from: value as NSNumber)
        return resultat!
    }
  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2017 modifié #12

    Ton code marche bien ici :



    func formatCourant(value: Float) -> String
    {
    let format = NumberFormatter()

    format.numberStyle = .currency

    let resultat = format.string(from: value as NSNumber)

    return resultat!
    }


    {
    let f: Float = 1.00

    let str = formatCourant(value: f)

    print(str)
    }



     


    €1,00


    (lldb)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Ou tu peux faire :



    func formatCourant(value: Float) -> String
    {
    let format = NumberFormatter()

    format.numberStyle = .currency

    let resultat = format.string(for: value)

    return resultat!
    }
  • GercofisGercofis Membre
    décembre 2017 modifié #14

    Merci Joanna, mon problème venait d'autre chose résultat de petits calculs que je ne manipule pas encore facilement...


    En bardant tout ça de print("....") j'ai rectifié le tir et maintenant c'est cohérent, du coup je manipule un peu mieux les conversions vers les Strings...


    Mais ce que je cherchais initialement c'est une page Web qui liste toutes les "\(....)" généralement utilisée dans les print de la sur la console. je l'ai eu mais elle se cache super bien... Mais grâce a mon coté Breton je ne désespère pas...


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2017 modifié #15

    On ne peut pas encore utiliser les "format specifiers" avec "\(...)"


     


    Quand même, pour String.init(format:_ : ), on a toujours https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html


     


    Ou, mieux


     


    https://developer.apple.com/documentation/swift/string/1779834-init


     


    pour prendre compte de la locale


  • C'est un peu ce que je cherchais, j'ai eu trouvé un tableau plus général, mais bon...


  • moi,  MIEUX !


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