我正在使用 NumberFormatter.Style.decimal
我需要 20000.23 应该是 20,000.23 因为我创建了一个扩展
var NumerWithDecimalPoint : String{
if self != ""{
let numberFormatter = NumberFormatter()
if IS_PERSIAN{
numberFormatter.locale = Locale(identifier: "fa_IR")
}else{
numberFormatter.locale = Locale(identifier: "EN")
}
numberFormatter.numberStyle = NumberFormatter.Style.decimal
numberFormatter.maximumFractionDigits = 2
numberFormatter.roundingMode = .floor
let number = numberFormatter.number(from: self)
let str = numberFormatter.string(from: number!)
return str!
}else{
return ""
}
}
如果在 en 中工作正常但在 fa_IR 中崩溃 let number = numberFormatter.number(from: self)
最佳答案
您的目标似乎是将以某种未知格式表示数字的字符串转换为以某种特定语言很好地格式化的表示相同数字的字符串。
崩溃的原因是,如果 IS_PERSIAN
为真,则由于波斯语言环境,尝试解析英语数字失败。然后你尝试强制打开 nil 数字。
您真正需要做的是尝试使用各种语言环境解析“self”,直到获得有效的 NSNumber
结果。然后使用所需的语言环境将该数字转换回字符串。
对您的代码进行以下更新可实现此目的:
extension String {
var numerWithDecimalPoint : String{
if self != ""{
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 2
numberFormatter.roundingMode = .floor
var number: NSNumber?
if let num = numberFormatter.number(from: self) {
number = num
} else {
numberFormatter.locale = Locale(identifier: "fa_IR")
if let num = numberFormatter.number(from: self) {
number = num
} else {
numberFormatter.locale = Locale(identifier: "en")
if let num = numberFormatter.number(from: self) {
number = num
}
}
}
let str: String
if let number = number {
if IS_PERSIAN{
numberFormatter.locale = Locale(identifier: "fa_IR")
}else{
numberFormatter.locale = Locale(identifier: "en")
}
if let res = numberFormatter.string(from: number) {
str = res
} else {
str = "Can't convert \(number) to a string"
}
} else {
str = "Can't convert \(self) to a number"
}
return str
}else{
return ""
}
}
}
此代码首先尝试使用用户的语言环境将原始字符串转换为数字。如果失败,它会尝试波斯语。如果失败,它会尝试英语。
关于iOS swift NumberFormatter 小数样式本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43840222/