як швидко додати коми до числа?


85

Як мені додати коми до числа, яке я швидко отримую з JSON.

Example
31908551587 to
31,908,551,587

Я така розгублена і не уявляю, що робити.

Відповіді:


169

Ви можете зробити це за допомогою 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)

чи є спосіб зробити подібні '31, 90,85,51,587 'за допомогою NumberFormatter?
Sanket_B

@SanketBhavsar, я не думаю, що перевірте
Özgür Ersil

2
@ ÖzgürErsil Я зробив це з валютою (стиль)
Sanket_B

як робити реверс
Єстай Муратов

Чи є спосіб перетворити 1000000000000000 на 1 000 000 000 000 000 ?? Тому що це працює на сім 0 після числа ...
Cemal BAYRI

43

Розширюючи відповідь Özgür Ersil, ви можете ізолювати функціональність за допомогою розширення Int:

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

Щоб потім використовувати у своєму коді як:

largeNumber.withCommas()

12

Крім того, розширюючи відповідь Хуана Фран Хіменеса, я б рекомендував помістити форматор в синглтон, оскільки створення екземпляра форматера зазвичай є відносно дорогою операцією. (Це може вплинути на продуктивність, якщо ви форматуєте в дорозі, як пише користувач.)

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.

Як зазначається у відповіді Жульєна, це використовує статичний форматор з міркувань продуктивності.

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. Також працює для десяткового введення, займе дві цифри після десяткової.

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. Для десяткової та іншої перевірки я ставлю окремі умови.
Vijay Patidar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.