In Swift 5、如何将Float转换为本地化的String以便在textField中显示?

In Swift 5, How to convert a Float to a String localized in order to display it in a textField?

我需要将 Float 转换为本地化的 String。 我写的这个函数是 Float 的扩展:

 func afficherUnFloat() -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.locale = Locale.current
        //numberFormatter.maximumFractionDigits = 2
        //numberFormatter.maximumIntegerDigits = 6
        
        if let result = numberFormatter.number(from: self) {
            return numberFormatter.string(for: result) ?? "0"
        }
        return "0"
    }

但没有用: 这是例子

let xxx : Float =  111.222
        myTextField.text = String(xxx).afficherUnFloat()

我安装了一个 pod KSNumericTextField,它限制了文本字段中的数字。他只有在本地格式化后才显示它。

当我 运行 应用程序时,它不会在法语区域显示 111,222,在阿拉伯区域显示 111,222。 什么都没有显示

这是最终的解决方案:

extension Float {
    
    func afficherUnFloat() -> String {
        let text : NSNumber = self as NSNumber
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.locale = .current
        numberFormatter.groupingSeparator = ""
        numberFormatter.maximumFractionDigits = 2 // your choice
        numberFormatter.maximumIntegerDigits = 6 // your choice

        let result = numberFormatter.string(from: text) ?? ""
            return result
    }
    
}

有了这个,您可以将每个 Float 格式化为本地化的字符串,与用户选择的键盘兼容,而不管他的位置或语言。 无需强制特殊键盘具有特定的小数点分隔符。

你可以这样使用它:

let myFloat: Float = 111.222
let myString :String = myFloat.afficherUnFloat()

myString 将根据位置要求显示

请注意,无需将 Float 转换为 NSNumber。您可以使用 Formatter 的方法 string(for: Any) 而不是 NumberFormatter 的方法 string(from: NSNumber)。顺便说一句,它会在您每次调用此 属性 时创建一个新的数字格式化程序。我会让你的格式化程序静态化:

extension Formatter {
    static let decimal: NumberFormatter = {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        numberFormatter.locale = .current
        numberFormatter.maximumFractionDigits = 2 // your choice
        numberFormatter.maximumIntegerDigits = 6 // your choice
        return numberFormatter
    }()
}
extension FloatingPoint {
    var afficherUnFloat: String { Formatter.decimal.string(for: self) ?? "" }
}

let float: Float = 111.222
let string = float.afficherUnFloat // "111.22"