将Firebase .value转换为NSDecimal-Swift

时间:2019-04-03 16:19:40

标签: swift nsdecimalnumber

我是Swift的新开发人员。我正在使用Swift 4.2和Xcode 10.1。

我需要从firebase中提取一个表示美元和美分的数字(例如10.20),然后将其加到该数字上,除以该数字等。结果应始终在小数点后有两个数字。

我正在尝试使用{% block content %} {{ super() }} New content here {% endblock %} ,但在转换时遇到错误。

这是我的代码。 NSDecimalNumber的类型为addend

NSDecimalNumber

我收到错误dbRef.observeSingleEvent(of: .value) { (snapshot) in // Get the balance let NSbalance = snapshot.value as! NSDecimalNumber // Add the addend let balance = NSbalance + addend // Set the new balance in the database and in the user defaults dbRef.setValue(balance) defaults.set(balance, forKey: Constants.LocalStorage.storedBalance) } 。当我接受它的建议并进行以下更改时:Cannot convert value of type 'NSDecimalNumber' to expected argument type 'Self'我得到“使用未解析的标识符Self。”

我应该为此目的使用Replace 'NSbalance' with 'Self(rawValue: Self.RawValue(NSbalance))吗?如果没有,我该怎么办?

1 个答案:

答案 0 :(得分:0)

解决方案是对类型使用Double。如果值是数字(不是字符串),则Firebase Realtime数据库中的.value类型为NSNumber,因此我可以轻松地将其转换为Double。尽管Double在以10为基数的计算中不具有Decimal的精度,但是对于我使用的低级货币值(在小数点后始终只有两个数字),它的精度要高得多。然后,我使用数字格式化程序将其格式化为货币,并消除小数点后的多余数字。起作用的代码如下:

该代码在服务中,用于添加金额以增加余额:

dbRef.observeSingleEvent(of: .value) { (snapshot) in

// Get the snapshot value
    let NSbalance = snapshot.value as! Double

    // Add the addend
    let balance = NSbalance + addend

    // Set the new balance in the database and in the user defaults
    dbRef.setValue(balance)
    defaults.set(balance, forKey: Constants.LocalStorage.storedBalance)

此代码在显示余额的视图控制器中:

 dbRef.observe(.value) { (snapshot) in
     //Get the balance
     self.balance = snapshot.value as! Double
     // Format the balance
     let currencyFormatter = NumberFormatter()
     currencyFormatter.numberStyle = .currency
     let balanceString = currencyFormatter.string(from: self.balance as NSNumber)
            self.balanceLabel.setTitle(balanceString, for: .normal)
 }