将 Firebase .value 转换为 NSDecimal - Swift

Converting Firebase .value to NSDecimal - Swift

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

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

我正在尝试使用 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'。当我接受它的建议并进行以下更改时:Replace 'NSbalance' with 'Self(rawValue: Self.RawValue(NSbalance)) 我得到 "use of unresolved identifier Self."

我应该为此目的使用 NSDecimalNumber 吗?如果没有,我该怎么办?

解决方案是使用 Double 作为类型。如果值是数字(不是字符串),Firebase 实时数据库中的 .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)
 }