[xcode] 신속하게 숫자에 쉼표를 추가하는 방법은 무엇입니까?

신속하게 JSON에서 검색하는 숫자에 쉼표를 어떻게 추가합니까?

Example
31908551587 to
31,908,551,587

너무 혼란스럽고 어떻게해야할지 모르겠습니다.



답변

당신은 그것을 할 수 있습니다 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)


답변

Özgür Ersil의 답변을 확장하면 Int로 확장하여 기능을 분리 할 수 ​​있습니다.

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

그런 다음 코드에서 다음과 같이 사용하려면

largeNumber.withCommas()


답변

또한 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)) ?? ""
    }
}


답변

확장을 통해 변수를 제공하는 확장의 간단한 드롭입니다 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


답변

이것은 쉼표 위치를 설정하는 추가 방법입니다. 숫자 10000000을 “1,00,00,000”으로 인쇄하고 싶다고 가정 해 보겠습니다.

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


답변

스위프트 4

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


답변

금액 텍스트 필드에 대한 클래스를 만들었습니다. 텍스트 필드 클래스로 설정하기 만하면됩니다. 예 : 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)
}}