iOS swift NumberFormatter 小数样式本地化

标签 ios swift number-formatting

我正在使用 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/

相关文章:

ios - 再次触摸时如何删除scnplane?

ios - 核心数据迁移——表已存在

ios - Swift 使用 reduce 从 bool 数组计算分数

javascript - 数字格式,删除千位分隔符

iphone - sizeToFit 运行异常

ios - 移动图像时更改像素颜色

swift - 无限 UICollectionview 与 UIPageControl

objective-c - iOS 和 OS X 之间的多点连接

Java : JFormattedTextField saving numbers

jquery - 如何让文本框中只允许有一个小数点分隔符?