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"
我需要将 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"