2015-11-13 12 views
5

próbuję przekonwertować ciąg do NSDecimalNumber tutaj to mój kod:Konwersja String na 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 
} 

Najpierw myślałem, że może jest źle, ale nawet z. to nie działa. Pierwszy wydruk (przed konwersją) pokazuje np. 80,00, ale wydruk (dziesiętny w tył) pokazuje tylko 80

jeśli wiersz jest just, aby sprawdzić, czy wynik nie jest liczbą.

+0

Czy próbowałeś 80.01? –

Odpowiedz

11

Użyj NSNumberFormatter, aby przeanalizować dane wejściowe. Ustawić jego generatesDecimalNumbers właściwość true:

let formatter = NumberFormatter() 
formatter.generatesDecimalNumbers = true 

Oto jak go używać, jeśli chcesz powrócić 0, gdy łańcuch nie może być analizowany:

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

decimal(with: "80.00") 

// Result: 80 as an NSDecimalNumber 

Domyślnie formater będą patrzeć na ustawienie regionalne urządzenia, aby określić znacznik dziesiętny. Powinieneś to zostawić w ten sposób. Przez wzgląd na przykład, będę zmuszać go do francuskiej regionalne:

// 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 

Jeśli naprawdę chcesz, aby zawsze używać przecinka jako znaku dziesiętnego, można ustawić właściwość decimalSeparator:

formatter.decimalSeparator = "," 
+0

to działało, ale musiałem wykonać 'let dataToDecimal = dataToDecimal.stringByReplacingOccurrencesOfString (", ", withString:". ")' First, aby mój ciąg nie był zerowy. Jeśli po prostu spróbuję napisu z ",", w wyniku tego otrzymam zero. – HongKongTom

+0

Przeczytałem, że NSDecimal jest precyzyjny do obliczeń, ale jeśli weźmie 80.01, to wynik 80.01000002, jeśli wezmę 80.10 to 80.09999999. Jak zmniejszyć cyfry do 2? – HongKongTom

+0

Będziesz musiał pokazać swój kod. Najlepiej byłoby zrobić to jako nowe pytanie. –

1

Nie ma nic złego w sposobie, w jaki tworzysz NSDecimalNumber z String. Jednak nie musisz się martwić, czy zastąpić przecinek kropką, jeśli tak są zapisane numery lokalnych formatów.

Powodem, dla którego drukuje 80 zamiast 80,00 lub 80,00, jest to, że print używa właśnie właściwości description tego numeru. Jeśli chcesz dostosować formatowanie, powinieneś skonfigurować swój własny NSNumberFormatter.

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

Próbowałem, ale w prawdziwym projekcie i na placu zabaw pojawia się komunikat o błędzie "Nie można przekonwertować wartości typu" Łańcuch "na oczekiwany typ argumentu" NSNumber ", ale ... minimumFractions, które mi się podoba i będzie się z tym bawić – HongKongTom

+0

Jest to możliwe to kolejny problem w twoim kodzie, kod który napisałem działa dobrze na placu zabaw. –