Convertir Double en String


#1

Je reviens encore vers vous voici mon code :

import UIKit

class WeatherProCell: UITableViewCell {

@IBOutlet weak var date: UILabel!
@IBOutlet weak var temp: UILabel!

var data: WeatherProData!

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
}

func creerCell(_ data: WeatherProData) {
    self.data = data
    let attributedDate = NSMutableAttributedString(string: self.data.date)
    date.attributedText = attributedDate

// let attributedTemp = NSMutableAttributedString(string: self.data.temp)
// temp.attributedText = attributedTemp
}
}

Je ne vois pas quelle fonction utiliser pour permettre à temp qui est un Double de s’afficher comme date.

Merci de me mettre sur la voie


#2

Hello,

Qu’est-ce que ton double exactement ? Juste un nombre ? Ou un Timestamp ? Ou autre ?

Bonne journée,

Alexandre


#3

D’après ton code, tu entres la date à partir d’un UILabel. C’est une mauvaise idée. L’utilisateur ne rate jamais une occasion de taper n’importe quoi !

Tu devrais utiliser un pickerDate pour que l’utilisateur puisse saisir les informations d’une manière parfaitement sécurisé, avec un composant graphique iOS que tout le monde connait.

Voici un lien sur un mini-tuto que j’ai écris pour quelqu’un ayant le même problème que toi. Il est question de Pickerdate, mais aussi de la manière d’utiliser la classe
DateFormatter pour afficher correctement une date.

https://cocoacafe.fr/index.php?p=/discussion/comment/152417#Comment_152417


#4

Le Double et un nombre à virgule que et repris d’un JSON

C’est en fait la température extérieur.

Et les données ne son écrite par les utilisateurs, mais tout et tiré du JSON

Voici les 3 fichier que j’utilise pour importer mes données et créer ma tableView

import UIKit
class WeatherProData {
    
    private var _date: String
    private var _temp: Double
    
    var date: String {
        return _date
    }
    
    var temp: Double {
        return _temp
    }
    
    init(date: String, temp: Double) {
        _date = date
        _temp = temp
    }
}




import UIKit
class WeatherProCell: UITableViewCell {
    @IBOutlet weak var date: UILabel!
    @IBOutlet weak var temp: UILabel!
    
    var data: WeatherProData!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
    
    func creerCell(_ data: WeatherProData) {
        self.data = data
        let attributedDate = NSMutableAttributedString(string: self.data.date)
        date.attributedText = attributedDate
//        let attributedTemp = NSMutableAttributedString(string: self.data.temp)
//        temp.attributedText = attributedTemp
    }
}



import UIKit
import Alamofire
import MapKit

class WeatherProController: UIViewController, CLLocationManagerDelegate, UITableViewDataSource,UITableViewDelegate  {
    
    var datas = [WeatherProData]()
    var locManager = CLLocationManager()
    var currentLocation: CLLocation!
    
    let identifiantCell = "dataProCell"
    let identifiantSegue = "versDetailDonneePro"
    
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var menuButton: UIBarButtonItem!
    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        locManager.requestAlwaysAuthorization()
        data()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        tableView.estimatedRowHeight = 100
        tableView.rowHeight = UITableView.automaticDimension
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return datas.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: identifiantCell) as? WeatherProCell {
//            if let date = cell.date {
//                date.text = "test \(indexPath.row)"
//            }
            let data = datas[indexPath.row]
            cell.creerCell(data)
            return cell
        }
        return UITableViewCell()
    }
    
    func data() {
        if ( CLLocationManager.authorizationStatus() == .authorizedWhenInUse ||
            CLLocationManager.authorizationStatus() == .authorizedAlways) {
            currentLocation = locManager.location
        }
        
        var headers: HTTPHeaders = [
            "Content-Type": "application/json"
        ]
        
        let user = loginWeatherPro
        let password = motDePasseWeatherPro
        
        if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {
            headers[authorizationHeader.key] = authorizationHeader.value
        }
        
        let now = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone.init(abbreviation: "UTC")
        formatter.locale = Locale(identifier: "en_US_POSIX")
        print(formatter.string(from: now))
        let days = Calendar.current.date(byAdding: .day, value: 15, to: now)
        //        print(formatter.string(from: days!))
        
        let urlB = urlDeBaseWeatherPro
        let locate = "locatedAt=\(currentLocation.coordinate.longitude),\(currentLocation.coordinate.latitude)"
        let period = "&validPeriod=PT0S"
        let validFrom = "&validFrom=\(formatter.string(from: now))"
        let validUntil = "&validUntil=\(formatter.string(from: days!))"
        let fields = "&fields=" + fieldsParameter
        let url = urlB + locate + period + validFrom + validUntil + fields
        print(url)
        
        Alamofire.request(url, headers:headers).responseJSON{ response in
            if let JSON = response.result.value as? [String: AnyObject] {
                if let forecast = JSON ["forecasts"] as? NSArray {
                    for element in forecast {
                        if let dict = element as? [String: AnyObject]{
                            if let dates = dict ["validFrom"] as? String {
                                if let temp = dict ["airTemperatureInCelsius"] as? Double {
                                    self.datas.append(WeatherProData(date: DateHelper.obtenir.jourDeLaSemaineWeather(dates)! + " " + (DateHelper.obtenir.heures(dates)!), temp: 1 ))
                                    
                                    self.tableView.reloadData()

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Donc j’aimerai maintenant importer mes données qui sont des Double comme la température ( 10.5 ), la pression ( 1030 ) etc …

Merci


#5

Tu peux construire une String à partir d’une variable quelconque, en utilisant une chaine de formatage. Voici un exemple pour convertir un Double en String, avec une précision d’un chiffre après la virgule.

let valeur:Double = 37.56
let strValeur = String(format: “%.1f”, valeur)
print ("valeur string : ", strValeur)

valeur string : 37.6


#6

Je pense que le problème vient de ma création de cellule.

car forcements comme temp n’est pas un string je ne peux utiliser

let attributedTemp = NSMutableAttributedString(string: self.data.temp)
temp.attributedText = attributedTemp

Je n’arrive pas à trouver la fonction adéquate pour faire cela avec un double


#7

Suffit de convertir le Double en String avec la syntaxe String(format:) que je t’ai montré.

Par contre je ne comprend pas l’intérêt de passer par des NSAttributedString, d’autant plus que je ne vois pas dans ton code une modification des attributs de formatage (type de police, taille des caractères, couleur, etc…). Ton problème vient peut-être de là.


#8

Tu peux aussi utiliser let attributedTemp = "\(self.data.temp)".


#9

Merci cela allège le code


#10

Oui, mais attention, cela génère un String simple non mutable, au lieu d’un NSMutableAttributedString comme ton code.

L’évaluateur syntaxique de Swift vas toujours au plus simple, et c’est tant mieux.


Je persiste à penser que tu devrais utiliser une conversion avec un formatage, pour éviter les problèmes d’affichage.

Les données venant d’une source extérieure, il est possible d’avoir une valeur avec de nombreux chiffres après la virgule. En utilisant une mise en forme pour ne garder qu’un ou deux chiffres après la virgule, tu évites de surcharger l’affichage avec des informations inutiles.

Exemple :

    // Valeur Double de base avec beaucoup de décimales
    let valeurBrute:Double = 37.566598765
    
    let string1 = "\(valeurBrute)"
    print ("Double->String simple : ", string1)
    
    let string2 = String(format: "%.2f", valeurBrute)
    print ("Double->String avec mise en forme : ", string2)

Double->String simple : 37.566598765

Double->String avec mise en forme : 37.57

C’est plus agréable de lire 37.57 que 37.566598765 ! Ou même 37.6 avec une mise en forme de prenant qu’un chiffre après la virgule…


#11

Merci beaucoup pour les explications je vais appliquer tout cela :grin: