数字にコンマをすばやく追加する方法は?


87

JSONから取得している数値にすばやくコンマを追加するにはどうすればよいですか。

Example
31908551587 to
31,908,551,587

私はとても混乱していて、どうしたらいいのかわかりません。

回答:


171

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

スウィフト4

let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))

スウィフト3

 let largeNumber = 31908551587
 let numberFormatter = NumberFormatter()
 numberFormatter.numberStyle = NumberFormatter.Style.decimal
 let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))

スウィフト2

 let largeNumber = 31908551587
 let numberFormatter = NSNumberFormatter()
 numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
 let formattedNumber = numberFormatter.stringFromNumber(largeNumber)

NumberFormatterを使用してこの「31,90,85,51,587」のようにする方法はありますか?
Sanket_B 2016

@SanketBhavsar私はそうは思いませんチェック
ÖzgürErsil

2
@ÖzgürErsil私は通貨(スタイル)でそれをしました
Sanket_B 2016

リバースの方法
Yestay Muratov 2016

1000000000000000を1,000,000,000,000,000に変換する方法はありますか?これらは、数字の後に7 0のために働くので...
ジェマルBAYRI

48

ÖzgürErsilの答えを拡張すると、Intへの拡張で機能を分離できます。

extension Int {
    func withCommas() -> String {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal
        return numberFormatter.string(from: NSNumber(value:self))!
    }
}

次に、コードで次のように使用します。

largeNumber.withCommas()

12

また、Juan Fran Jimenezの回答を拡張して、フォーマッターのインスタンス化は通常比較的コストのかかる操作であるため、フォーマッターをシングルトンにすることをお勧めします。(ユーザーが書いているように外出先でフォーマットしている場合は、パフォーマンスに影響を与える可能性があります。)

extension Int {

    private static var commaFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        return formatter
    }()

    internal var commaRepresentation: String {
        return Int.commaFormatter.string(from: NSNumber(value: self)) ?? ""
    }
}

10

の拡張子を介して変数を提供する拡張子の単純なドロップInt

Julienの回答に記載されているように、これはパフォーマンス上の理由から静的フォーマッターを使用します。

extension Int {
    private static var numberFormatter: NumberFormatter = {
        let numberFormatter = NumberFormatter()
        numberFormatter.numberStyle = .decimal

        return numberFormatter
    }()

    var delimiter: String {
        return Int.numberFormatter.string(from: NSNumber(value: self)) ?? ""
    }
}

それを使用するには:

let number = 31908551587
print(number.delimiter) // 31,908,551,587

1
??? あなたのコードは、ジュリアンの答えと実質的に同じです。唯一の違いは彼が持っていることでinternal varあり、あなたはただ持っていvarます。あなたの答えは会話に何を追加しますか?また、あなたの変数delimiterは誤解を招くと思います。ジュリアンの方commaRepresentationがはるかに便利です。
Zonker.in.Geneva

2

これは、カンマの位置を設定する追加の方法です。数値10000000を「1,00,00,000」と出力したいとします。

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.groupingSize = 3
numberFormatter.secondaryGroupingSize = 2
numberFormatter.string(from: 10000000)

1

スウィフト4

let largeNumber = 31908551587
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
let formattedNumber = numberFormatter.string(from: NSNumber(value:largeNumber))

0

金額テキストフィールドのクラスを作成しました。テキストフィールドクラスに設定するだけです。例-1234567と入力します。1,234,567に変換されます。10進数の入力でも機能し、10進数の後に2桁かかります。

class AmountField: UITextField {

private var isFirstDecimal : Bool = true
override func willMove(toSuperview newSuperview: UIView?) {

    addTarget(self, action: #selector(editingChanged), for: .editingChanged)
    keyboardType = .decimalPad
    textAlignment = .left
    placeholder = "0.0"
    editingChanged()
}
override func deleteBackward() {
    var currentText = self.text ?? ""
    currentText = String(currentText.dropLast())
    self.text = currentText
    editingChanged(self)
}
@objc func editingChanged(_ textField: UITextField? = nil) {
    var doubleStr = textField?.text ?? "00"


    let decimalCount = doubleStr.components(separatedBy: ".")
    if decimalCount.count > 2 {
        var currentText = self.text ?? ""
        currentText = String(currentText.dropLast())
        self.text = currentText
        return
    }

    if doubleStr.contains(".") && isFirstDecimal == true {
        self.text = doubleStr
        isFirstDecimal = false
        return
    }
    else if !(doubleStr.contains(".")) {
        isFirstDecimal = true
    }

    let doubleStrTemp = doubleStr.replacingOccurrences(of: ",", with: "")

    if doubleStrTemp != "" {
        if let n = Decimal(string: doubleStrTemp )?.significantFractionalDecimalDigits {
            if n > 2 {
                var currentText = self.text ?? ""
                currentText = String(currentText.dropLast())
                self.text = currentText
                return
            }
        }
    }
    doubleStr = doubleStr.replacingOccurrences(of: ",", with: "")

    let doube = Double(doubleStr)
    let numberFormatter = NumberFormatter()
    numberFormatter.numberStyle = NumberFormatter.Style.decimal
    if doube != nil {
        let formattedNumber = numberFormatter.string(from: NSNumber(value:doube!))
        self.text = formattedNumber
    }
}}

extension Decimal {
var significantFractionalDecimalDigits: Int {
    return max(-exponent, 0)
}}

いいえ、NSNumberFormatterを使用しています。10進数およびその他の検証のために、個別の条件を設定します。
Vijay Patidar 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.