2017-05-30 1 views
0

Je suis en train de faire des calculs de champs de texte je l'ai appris à travailler en utilisant Doubles:NSDecimal nombre multiplication

let firstValue = Double(miles.text!) 
    let secondValue = Double(payPerMile.text!) 
    let formatter = NumberFormatter() 
    formatter.numberStyle = .currency 
    formatter.minimumFractionDigits = 2 
    formatter.maximumFractionDigits = 2 
    formatter.locale = Locale.current 
    formatter.usesGroupingSeparator = true 

    let result = Double(firstValue! * secondValue!) as NSNumber 
    grossPay.text = "\(formatter.string(from: result)!)" 

Tout en faisant plus de recherches sur le sujet, j'été informé que l'utilisation de double n'est pas le meilleur itinéraire pour allez donc j'essaie d'utiliser NSDecimalNumber à la place.

Mon problème est que je ne peux pas comprendre comment le faire fonctionner lors de la commutation.

@IBAction func miles(_ sender: Any) { 

    let firstValue = NSDecimalNumber(string: miles.text) 
    let formatter = NumberFormatter() 
    formatter.numberStyle = .decimal 
    formatter.maximumFractionDigits = 2 
    formatter.usesGroupingSeparator = true 

    miles.text = "\(formatter.string(from: firstValue as NSNumber)!)" 

} 

@IBAction func payPerMile(_ sender: Any) { 

    let firstValue = NSDecimalNumber(string: payPerMile.text) 
    let formatter = NumberFormatter() 
    formatter.numberStyle = .currency 
    formatter.minimumFractionDigits = 2 
    formatter.maximumFractionDigits = 2 
    formatter.locale = Locale.current 
    formatter.usesGroupingSeparator = true 

    payPerMile.text = "\(formatter.string(from: firstValue as NSNumber)!)" 

} 

@IBAction func grossPay(_ sender: Any) { 

    let firstValue = NSDecimalNumber(string: miles.text!) 
    let secondValue = NSDecimalNumber(string: payPerMile.text!) 
    let formatter = NumberFormatter() 
    formatter.numberStyle = .currency 
    formatter.minimumFractionDigits = 2 
    formatter.maximumFractionDigits = 2 
    formatter.locale = Locale.current 
    formatter.usesGroupingSeparator = true 

    let result = (firstValue as Decimal) * (secondValue as Decimal) as NSDecimalNumber 
    grossPay.text = "\(formatter.string(from: result)!)" 

me donne juste le résultat de NaN

miles.text est formaté pour .decimal payPerMile.text est formaté pour .currency

Je ne sais pas si cela pourrait faire partie de mon problème ou non.

Répondre

0

Si payPerMile est formaté comme .currency, il contient probablement un caractère de devise. Vous ne pouvez pas simplement créer un NSDecimalNumber à partir d'une telle chaîne.

Votre deuxième ligne vous donne un NaN pour secondValue.

Ce que vous pouvez faire, est d'utiliser un NumberFormatter pour obtenir le NSNumber de la chaîne.

let formatter = NumberFormatter() 
formatter.numberStyle = .currency 
let payPerMileNumber = formatter.number(from: "$34.75") // NSNumber with 34.75 
+0

Désolé pour la longue pause ..... Je ne peux pas sembler obtenir que pour travailler – OEZ

+0

Pouvez-vous montrer un exemple concret de la '' miles' et le texte payPerMile'? – fguchelaar

+0

J'ai ajouté le code pour miles et payPerMile .... J'espère que c'est ce dont vous aviez besoin. – OEZ