如何用
分开转换数字构造示例结果字符串
"38963.26" value into "38,863.26"
"1013321.22" Value into "10,13,321.22"
//MARK:- Seperator number formate 1000 - 1,000
extension Formatter {
static let withSeparator: NumberFormatter = {
let formatter = NumberFormatter()
formatter.groupingSeparator = ","
formatter.numberStyle = .decimal
return formatter
}()
}
extension BinaryFloatingPoint {
var formattedWithSeparator: String {
return Formatter.withSeparator.string(for: self) ?? ""
}
}
let resultValue = StringValue.CGFloatValue()?.formattedWithSeparator
print("Resultant", resultValue!)
cgfloatvaule默认方法,用于将字符串转换为floatValue。像string.floatvalue一样。
对于价值" 38963.26" 给出了结果值" 38,963.262" 我想知道为什么它像十进制中的额外2一样。
。print("38963.26".CGFloatValue()!.formattedWithSeparator)
Output "38,863.262"
在您的格式化一个实例上设置适当的(使用此样式用于格式化的语言环境(,或者在格式化的实例上设置小数和分组分隔符,因为并非所有语言环境都可能使用相同的分离器。
然后,如果您使用的是float(由于某种原因,Double
不需要(
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "en_US")
formatter.maximumFractionDigits = 2
if let str = formatter.string(for: Float(numberString)) {
print(str)
}
let formatter = NumberFormatter()
formatter.groupingSeparator = ","
formatter.decimalSeparator = "."
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
if let str = formatter.string(for: Float(numberString)) {
print(str)
}
两者都产生
38,963.26
请参考以下内容: - 如何将逗号添加到Swift中的一个数字?在此处输入链接描述
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let numberString = "38963.26"
if let number = Double(numberString),
let formattedNumber = numberFormatter.string(from: NSNumber(value: number)) {
let formattedString = "(formattedNumber)"
print(formattedString)
}
有三个问题:
-
使用显式分组分离器。
强迫成千上万的分离器"是适得其反的。如果该设备位于已经默认的语言环境中,则无需指定它。而且,如果该设备位于不默认的语言环境中,那么对于不习惯看到"千分之一分隔符的用户而言,它将极大地混淆。更糟糕的是,如果您要覆盖分组分离器,也应该覆盖小数分离器。如果这是在用户界面中显示的字符串,我建议不要触摸分组分隔符(或任何这些属性(:
static let decimal: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter }()
如果您真的想强制使用
,
进行分组分组,而.
进行十进制分离器(即使用户可能位于一个区域中,如果您在用户界面中表现出可能会令人困惑的地方(,您也应该继续并将其更改为您想要的任何东西,例如static let decimal: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.locale = Locale(identifier: "en_US") // or "en_IN" or whatever return formatter }()
-
小数点。
如果您总是想要两个小数点的位置,则:
static let decimal: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.minimumFractionDigits = 2 formatter.maximumFractionDigits = 2 return formatter }()
通过设置最小分数,您确保42.1将显示为" 42.10"。通过设置最大分数数字,您确保42.33333将显示为" 42.33"。
-
从字符串转换为二进制浮点和返回字符串的问题。
小数点位置的基本问题是,您将字符串转换为二进制浮点数。如果使用
Double
,则比Float
/CGFloat
捕获更多的数字,但是当您将字符串转换为二进制浮点代表时,您仍在引入四舍五入错误。Float
开始在第七大十进制数字上引入转换错误。Double
将转换误差定为第15个有效的十进制数字。您可以考虑使用数字格式,该格式将捕获多达38位数字而无需四舍五入问题,即
Decimal
。因此:extension NumberFormatter { static let decimal: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal // specify locale and/or fraction digits as needed return formatter }() } extension String { func decimalFormatted() -> String? { return Decimal(string: self).flatMap { NumberFormatter.decimal.string(for: $0) } } }
,然后
let string = "38963.26" let foo = string.decimalFormatted() ?? ""