如何在Swift中将Decimal
转换为String
?
例如:
let de = Decimal(string: "123")
那么如何将 de
转换为字符串。
利用 Decimal 符合协议 CustomStringConvertible
的事实,我只需要这样做:
let decimalString = "\(de)"
String(describing: de)
,因为这是Apple推荐的方法之一。当处理符合CustomStringConvertible协议的类型时,"使用String(describing:)
初始化器是将任何类型的实例转换为字符串的首选方式。" - Guillaume AlgisCustomStringConvertible
是一个调试API的? - Marco将其转换为NSDecimalNumber并使用stringValue。
NSDecimalNumber(decimal: de).stringValue
String(describing: de)
似乎是更好的方法,或者像 @Marco 回答的那样使用字符串插值。 - Guillaume Algisextension Formatter {
static let stringFormatters: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .none
return formatter
}()
}
extension Decimal {
var formattedString: String {
return Formatter.stringFormatters.string(for: self) ?? ""
}
}
你可以这样展示
label.text = someDecimal.formattedString
string(from:)
, 而不是 string(for:)
。 - ma11hew28NSNumberFormatter
来解析您的输入。将其generatesDecimalNumbers
属性设置为true:let formatter = NumberFormatter()
formatter.generatesDecimalNumbers = true
以下是如何使用它的方法,如果您想在字符串无法解析时返回0:
func decimal(with string: String) -> NSDecimalNumber {
return formatter.number(from: string) as? NSDecimalNumber ?? 0
}
decimal(with: "80.00")
// Result: 80 as an NSDecimalNumber
默认情况下,格式化程序将查看设备的区域设置以确定小数点。您应该保持这种方式。为了举例说明,我将强制使用法语区域设置:
// 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
如果您真的想始終使用逗號作為小數分隔符,可以設置decimalSeparator
屬性:
formatter.decimalSeparator = ","
Decimal
转换为String
,而不是如何将String
转换为Decimal
。对于前者,您不需要将formatter.generatesDecimalNumbers
设置为true
,并且应调用formatter.string(from: number)
而不是formatter.number(from: string)
。但是,@Berik声称这对于每个可能的Decimal
值都无法正常工作。 - ma11hew28
de.description
但你可能需要使用as NSDecimalNumber
来访问description(withLocale:)
。你也可以使用NumberFormatter
,尽管它总是首先将小数转换为double
,但在大多数情况下这不是问题。 - Sulthan