格式化Swift中的数字3

Gla*_*sen 6 numbers nsnumberformatter swift

我想格式化数字:来自123234234234的123.234.234.234取决于用户在文本字段中键入的内容.我不想管理货币,它不是关于货币,而是关于用户必须输入一个数字,这个数字应该正确格式化以便于阅读.

不带逗号,带点.

我在整个研究中发现只有货币

Zel*_* B. 15

您正在寻找的可能groupingSeparatorNumberFormatter

let formater = NumberFormatter()
formater.groupingSeparator = "."
formater.numberStyle = .decimal
let formattedNumber = formater.string(from: number)
Run Code Online (Sandbox Code Playgroud)


kka*_*urt 7

你可以这样做NumberFormatter:

let yourNumber = 123234234234 
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
numberFormatter.groupingSeparator = "."
let formattedNumber = numberFormatter.string(from: NSNumber(value:yourNumber))
Run Code Online (Sandbox Code Playgroud)


Vas*_*huk 7

细节

xCode 9.2,Swift 4

import Foundation

extension String { var toLocale: Locale { return Locale(identifier: self) } }

extension NumberFormatter {
    convenience init(numberStyle: NumberFormatter.Style, groupingSeparator: String?, decimalSeparator: String?) {
        self.init()
        set(numberStyle: numberStyle, groupingSeparator: groupingSeparator, decimalSeparator: decimalSeparator)
    }

    convenience init(numberStyle: NumberFormatter.Style, locale: Locale) {
        self.init()
        set(numberStyle: numberStyle, locale: locale)
    }

    func set(numberStyle: NumberFormatter.Style, groupingSeparator: String?, decimalSeparator: String?) {
        self.locale = nil
        self.numberStyle = numberStyle
        self.groupingSeparator = groupingSeparator
        self.decimalSeparator = decimalSeparator
    }

    func set(numberStyle: NumberFormatter.Style, locale: Locale?) {
        self.numberStyle = numberStyle
        self.locale = locale
    }
}

extension Numeric {
    func format(formatter: NumberFormatter) -> String? {
        if let num = self as? NSNumber { return formatter.string(from: num) }
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

let formatter = NumberFormatter(numberStyle: .decimal, locale: "fr_FR".toLocale)
print(value.format(formatter: formatter))

formatter.set(numberStyle: .decimal, groupingSeparator: " ", decimalSeparator: ".")
print(value.format(formatter: formatter))
Run Code Online (Sandbox Code Playgroud)

完整样本

不要忘记在此处添加解决方案代码

func test<T: Numeric>(value: T) {
    print("=========================================================")
    print("\(T.self), value = \(value)")

    let formatter = NumberFormatter(numberStyle: .decimal, locale: "fr_FR".toLocale)
    print(value.format(formatter: formatter) ?? "nil")
    formatter.set(numberStyle: .currency, locale: "de_DE".toLocale)
    print(value.format(formatter: formatter)  ?? "nil")
    formatter.set(numberStyle: .decimal, groupingSeparator: " ", decimalSeparator: ".")
    print(value.format(formatter: formatter)  ?? "nil")
}

func print(title: String, value: String?) {
    if let value = value { print("\(title) \(value)") }
}

test(value: Int(10000))
test(value: Double(10000.231))
test(value: Float(10000.231))
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述


use*_*924 5

实际上有一个更简单的解决方案(无需创建NumberFormatter实例),并且它考虑了用户的语言:

let result = String(format: "%ld %@", locale: Locale.current, viewCount, "views")
Run Code Online (Sandbox Code Playgroud)

英文值1000000的结果:

1,000,000

俄语:

1000000

Android中的ps完全相同 String.format(Locale.getDefault(), "%,d %s", viewCount, "views")