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


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)

NumberFormatter를 사용하여 '31, 90,85,51,587 '과 같이 할 수있는 방법이 있습니까?
Sanket_B

내가 생각하지 않는다 @SanketBhavsar 그래서 확인
오즈 Ersil에게

2
@ ÖzgürErsil 내가 통화로했다 (스타일)
Sanket_B

반대로 수행하는 방법
Yestay Muratov 2011

1000000000000000을 1,000,000,000,000,000으로 변환하는 방법이 있습니까? 이 숫자 후 7 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

또한 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
??? 귀하의 코드는 Julien의 답변과 거의 동일합니다. 유일한 차이점은 그가 가지고 internal var있고 당신이 가지고 있다는 것 var입니다. 귀하의 답변은 대화에 무엇을 추가합니까? 또한 귀하의 변수 delimiter가 오해의 소지 가 있다고 말하고 싶습니다 . Julien 's 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를 사용하고 있습니다. 십진수 및 기타 유효성 검사를 위해 별도의 조건을 설정했습니다.
비제이 Patidar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.