将 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)
}
我是一名新 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)
}