如何在数字中快速添加逗号?


Answers:


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)

有什么办法可以使用NumberFormatter进行类似“ 31,90,85,51,587”的操作?
Sanket_B

@SanketBhavsar我不这么认为检查
Özgür的Ersil

2
@ÖzgürErsil我用货币(样式)
做到了


有什么办法可以将1000000000000000转换为1,000,000,000,000,000 ?? 因为这些数字后面的数字为7 0 ...
Cemal BAYRI

43

扩展ÖzgürErsil的答案,您可以通过扩展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

正如朱利安(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
??? 您的代码实际上与Julien的答案相同。唯一不同的是他有,internal var而你只有var。您的答案对对话有什么帮助?另外,我会说您的变量delimiter具有误导性。Julien'scommaRepresentation有用得多。
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

我为金额文本字段创建了一个类。只需将其设置为您的textfield类。例如,输入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。对于小数和其他验证,我分别设置了条件。
维杰·帕蒂达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.