web-dev-qa-db-ja.com

Swift 3での数値のフォーマット

数値を次のようにフォーマットしたい:123234234234からの123.234.234.234は、ユーザーがテキストフィールドに入力した内容によって異なります。通貨を管理したくありません。通貨についてではなく、ユーザーが数値を入力する必要があるためです。この数値は、読みやすくするために正しくフォーマットする必要があります。

コンマではなく、ドットを使用します。

研究全体で通貨のものだけを見つけた

6
Glatteisen

あなたが探しているのはおそらく groupingSeparator of NumberFormatter

let formater = NumberFormatter()
formater.groupingSeparator = "."
formater.numberStyle = .decimal
let formattedNumber = formater.string(from: number)
16
Zell B.

あなたはNumberFormatterでそれを行うことができます:

let yourNumber = 123234234234 
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = NumberFormatter.Style.decimal
numberFormatter.groupingSeparator = "."
let formattedNumber = numberFormatter.string(from: NSNumber(value:yourNumber))
8
kkakkurt

細部

  • Xcode 9.2、Swift 4
  • Xcode 10.2(10E125)、Swift 5

解決

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
    }
}

使用法

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))

完全なサンプル

忘れずにここにソリューションコードを追加

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))

結果

=========================================================
Int, value = 10000
10 000
10.000,00 €
10 000
=========================================================
Double, value = 10000.231
10 000,231
10.000,23 €
10 000.231
=========================================================
Float, value = 10000.231
10 000,231
10.000,23 €
10 000.231
7

実際にははるかに簡単な解決策があり(NumberFormatterインスタンスを作成する必要はありません)、ユーザーの言語を考慮に入れます。

_let result = String(format: "%ld %@", locale: Locale.current, viewCount, "views")
_

英語での値1000000の結果:

1,000,000

ロシア:

1000 000

pS Androidまったく同じですString.format(Locale.getDefault(), "%,d %s", viewCount, "views")

6
user924

スウィフト4

extension Int {
    func formatnumber() -> String {
        let formater = NumberFormatter()
        formater.groupingSeparator = "."
        formater.numberStyle = .decimal
        return formater.string(from: NSNumber(value: self))!
    }
}
2
Ahmed Safadi

Swift 4の場合、フォーマットを選択するか、何も選択されていない場合はデフォルトのフォーマットを使用できる拡張機能を実装しました。

extension Int {
    func formatnumber(groupingSeparator: String?) -> String {
        let formater = NumberFormatter()
        formater.groupingSeparator = (groupingSeparator != nil) ? groupingSeparator! : ","
        formater.numberStyle = .decimal
        return formater.string(from: NSNumber(value: self))!
    }
}
0
Pavle Mijatovic