web-dev-qa-db-ja.com

SwiftでIntに千の区切り文字を追加する

私はSwiftにかなり新しく、スペースを千の区切りとして追加する方法を見つけるのに苦労しています。

私が達成したいのは、計算の結果を取得し、テキストフィールドに表示して、フォーマットが次のようになることです:

2 358 000

の代わりに

2358000

例えば。

Int値をフォーマットしてからStringに変換するのか、Int値がStringに変換された後にスペースを追加するのかはわかりません。どんな助けも大歓迎です。

45
alionthego

NSNumberFormatterを使用して、次のように異なるグループ化区切り文字を指定できます。

更新:Xcode 9•Swift 4

extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " "
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension BinaryInteger {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

Xcode 8.3.2•Swift 3.1

extension Formatter {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " "
        formatter.numberStyle = .decimal
        return formatter
    }()
}

extension Integer {
    var formattedWithSeparator: String {
        return Formatter.withSeparator.string(for: self) ?? ""
    }
}

let myInt = 2358000
let myIntString = myInt.formattedWithSeparator  // "2 358 000"

注:ピリオドと同じ幅のスペースが必要な場合は、"\u{2008}"

ユニコードスペース

formatter.groupingSeparator = "\u{2008}"
101
Leo Dabus

NSNumberFormatterを使用します:

let fmt = NSNumberFormatter()
fmt.numberStyle = .DecimalStyle
fmt.stringFromNumber(2358000)  // with my locale, "2,358,000"
fmt.locale = NSLocale(localeIdentifier: "fr_FR")
fmt.stringFromNumber(2358000)  // "2 358 000"
29

Swift 5の場合、数字の表示をフォーマットする必要がある場合、NumberFormatterが適切なツールです。


NumberFormatterには numberStyle というプロパティがあります。 numberStyleを_NumberFormatter.Style.decimal_の値に設定して、フォーマッターのスタイルを10進数に設定できます。

したがって、数値を10進数スタイルで書式設定する最も単純なケースでは、次のPlaygroundコードを使用できます。

_import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
_

ユーザーの現在のロケールに応じて、このコードはOptional("2,358,000") foren_USまたはOptional("2 358 000") forfr_FR


NumberFormatterの-​​ locale プロパティを_Locale.current_に設定する次のコードスニペットは、以前のPlaygroundコードと同等です。

_import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale.current

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
_

以下のNumberFormatterの-​​ groupingSeparator プロパティを_Locale.current.groupingSeparator_に設定したPlaygroundコードも前者と同等です:

_import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.groupingSeparator = Locale.current.groupingSeparator

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
_

それ以外の場合、特定のロケール形式スタイルで数値形式を設定する場合は、次のPlaygroundコードを使用できます。

_import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.locale = Locale(identifier: "FR_fr")

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
// prints: Optional("2 358 000")
_

ただし、本当に必要なのが特定のグループ化区切りを適用することである場合は、以下のPlaygroundコードを使用できます。

_import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.groupingSeparator = " "

let amount = 2358000
let formattedString = formatter.string(for: amount)
print(String(describing: formattedString))
// prints: Optional("2 358 000")
_
16
Imanou Petit

Leo Dabusの回答はSwiftに翻訳されています:

任意の.Swiftファイル、クラス外:

struct Number {
    static let withSeparator: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.groupingSeparator = " " // or possibly "." / ","
        formatter.numberStyle = .decimal
        return formatter
    }()
}
extension Integer {
    var stringWithSepator: String {
        return Number.withSeparator.string(from: NSNumber(value: hashValue)) ?? ""
    }
}

使用法:

let myInteger = 2358000
let myString = myInteger.stringWithSeparator  // "2 358 000"
6
David Seek