【问题标题】:iOS swift NumberFormatter decimal style localizationiOS swift NumberFormatter 十进制风格本地化
【发布时间】:2017-10-06 00:25:40
【问题描述】:

我正在使用 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) 中崩溃

【问题讨论】:

  • 什么是崩溃日志?

标签: ios swift number-formatting


【解决方案1】:

您的目标似乎是将表示某种未知格式的数字的字符串转换为表示以某种特定语言很好地格式化的相同数字的字符串。

崩溃的原因是,如果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 ""
        }
    }
}

此代码首先尝试使用用户的区域设置将原始字符串转换为数字。如果失败,它会尝试波斯语。如果失败,它会尝试英语。

【讨论】:

    【解决方案2】:

    试试这个:

    let Formatter: NumberFormatter = NumberFormatter()
    Formatter.locale = Locale(identifier: "EN")
    let number = Formatter.number(from: self)
    let str = numberFormatter.string(from: number! )
    

    【讨论】:

    • 每次使用! 都意味着“在这里崩溃”。请使用可选项的安全展开。
    • 这个答案并不能解决任何问题。如果self 的值是波斯数字字符串并且用户的语言环境不是波斯(反之亦然),则对Double(self) 的调用将返回nil
    • 不,它不起作用。如果self 是波斯字符串,它会崩溃。
    • 给我任何一个波斯号码。然后我将发送该代码的屏幕截图。
    • 我将您当前答案中的代码粘贴到操场上。使用字符串۲۰٬۰۰۰٫۲۳numbernil
    【解决方案3】:

    您的问题出在小数点分隔符上。似乎标准波斯格式使用逗号“,”而不是点“。”为十进制符号。如果您更喜欢使用英文格式,则必须定义小数分隔符。

    var NumerWithDecimalPoint : String{
    
            if !self.isEmpty{
    
                let numberFormatter = NumberFormatter()
    
                if IS_PERSIAN{
                    numberFormatter.locale = Locale(identifier: "fa_IR")
                }else{
                    numberFormatter.locale = Locale(identifier: "EN")
                }
    
                numberFormatter.decimalSeparator = "." //decimal separator
                numberFormatter.numberStyle = NumberFormatter.Style.decimal
                numberFormatter.maximumFractionDigits = 2
                numberFormatter.roundingMode = .floor
    
                if let number = numberFormatter.number(from: self) {
                    return  numberFormatter.string(from: number) ?? ""
                }
            }
            return "Bad format number"
        }
    

    【讨论】:

      【解决方案4】:

      在操场上,我做了这样的示例代码

      let largeNumber = 1000000
      let numberFormatter = NumberFormatter()
      numberFormatter.locale = Locale(identifier: "fa")
      numberFormatter.numberStyle = NumberFormatter.Style.decimal
      numberFormatter.string(from: NSNumber(value: largeNumber))
      print(numberFormatter.string(from: NSNumber(value: largeNumber))!)
      

      结果:“10000”

      所以如果locale是“fa-IR”,就不应该设置locale

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        相关资源
        最近更新 更多