2015-11-13 9 views
5

ich versuche, einen String in einen NSDecimalNumber zu konvertieren hier ist es mein Code:Convert String zu NSDecimalNumber

class func stringToDecimal (dataToDecimal: String) -> NSDecimalNumber { 

    let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString(",", withString: ".") 
    print(dataToDecimal) 
    let decimalReturn = NSDecimalNumber(string: dataToDecimal) 
    print(decimalReturn) 

    if decimalReturn == NSDecimalNumber.notANumber(){ 
     return 0.00 
    } 
    return decimalReturn 
} 

Zuerst dachte ich, dass vielleicht die, falsch ist, aber auch mit. es funktioniert nicht. Der erste Druck (vor der Konvertierung) zeigt z. B. 80,00, aber der Druck (dezimalReturn) zeigt nur 80

die Zeile ist die einzige, um zu überprüfen, ob das Ergebnis keine Zahl ist.

+0

Haben Sie 80.01 versucht? –

Antwort

11

Verwenden Sie eine NSNumberFormatter, um Ihre Eingabe zu analysieren. Legen Sie seine generatesDecimalNumbers Eigenschaft auf true:

let formatter = NumberFormatter() 
formatter.generatesDecimalNumbers = true 

Hier ist, wie Sie es verwenden, wenn Sie 0 zurückkehren wollen, wenn die Zeichenfolge nicht analysiert werden können:

func decimal(with string: String) -> NSDecimalNumber { 
    return formatter.number(from: string) as? NSDecimalNumber ?? 0 
} 

decimal(with: "80.00") 

// Result: 80 as an NSDecimalNumber 

standardmäßig die Forma sehen wird die Gebietsschemaeinstellung des Geräts, um die Dezimalmarkierung zu bestimmen. Du solltest es so lassen. Aus Gründen des Beispiels werde ich es auf eine Französisch locale erzwingen:

// DON'T DO THIS. Just an example of behavior in a French locale. 
formatter.locale = Locale(identifier: "fr-FR") 

decimal(with: "80,00") 
// Result: 80 

decimal(with: "80.00") 
// Result: 0 

Wenn Sie wollen immer ein Komma als Dezimalzeichen wirklich, können Sie die decimalSeparator Eigenschaft:

formatter.decimalSeparator = "," 
+0

es funktionierte, aber ich musste die 'let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString (", ", mitString:". ")' Zuerst, um meine Zeichenfolge nicht nil zu bekommen. Wenn ich nur eine Zeichenfolge mit einem "," versuche, wird dies als Ergebnis null ergeben. – HongKongTom

+0

Ich habe gelesen, dass NSDecimal für die Berechnung genau ist, aber wenn ich 80.01 nehme, ist das Ergebnis 80.01000002, wenn ich 80.10 nehme, ist es 80.09999999. Wie würdest du die Ziffern auf 2 reduzieren? – HongKongTom

+0

Sie müssen Ihren Code zeigen. Es wäre am besten, dies als eine neue Frage zu tun. –

1

Es ist nichts falsch mit der Art, wie Sie ein NSDecimalNumber von einem String erstellen. Es kann jedoch sein, dass Sie sich keine Gedanken darüber machen müssen, ob Sie das Komma durch einen Punkt ersetzen möchten, wenn Ihre lokalen Formate dies tun.

Der Grund, dass es 80 statt 80,00 oder 80,00 druckt, ist, dass print nur die description Eigenschaft der Nummer verwendet. Wenn Sie die Formatierung anpassen möchten, sollten Sie Ihre eigene NSNumberFormatter einrichten.

let number = NSDecimalNumber(string: "80.00") 
print(number) // 80 
let formatter = NSNumberFormatter() 
formatter.minimumFractionDigits = 2 
let string = formatter.stringFromNumber(number) 
print(string) // 80.0 
+0

10 Ich habe es ausprobiert, aber im realen Projekt und Spielplatz bringt es eine Fehlermeldung "Kann Wert des Typs" String "nicht in den erwarteten Argumenttyp" NSNumber "konvertieren, aber die ... minimumFraktionen mag ich und werde damit spielen. – HongKongTom

+0

Dort ist es möglich ist ein anderes Problem in Ihrem Code dann. Der Code, den ich bekannt gab, funktioniert gut auf einem Spielplatz. –