Swift'de bir sayıya virgül nasıl eklenir?


87

JSON'dan hızlı bir şekilde aldığım bir sayıya nasıl virgül eklerim?

Example
31908551587 to
31,908,551,587

Kafam çok karıştı ve ne yapacağım konusunda hiçbir fikrim yok.

Yanıtlar:


171

İle yapabilirsin NSNumberFormatter

Swift 4

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

Hızlı 3

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

Swift 2

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

NumberFormatter kullanarak bunu '31, 90,85,51,587 'yapmanın bir yolu var mı?
Sanket_B

@SanketBhavsar Sanmıyorum kontrol et
Özgür Ersil

2
@ ÖzgürErsil Para birimi (stil) ile yaptım
Sanket_B

ters nasıl yapılır
Yestay Muratov

1000000000000000'i 1.000.000.000.000.000'e dönüştürmenin herhangi bir yolu var mı? Bu numaradan sonra yedi 0 için çalışır Çünkü ...
Cemal BAYRI

48

Özgür Ersil'in cevabını genişleterek, işlevselliği Int'e bir genişletme ile izole edebilirsiniz:

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

Daha sonra kodunuzda şu şekilde kullanmak için:

largeNumber.withCommas()

12

Ayrıca Juan Fran Jimenez'in cevabını genişleterek, bir formatlayıcıyı örneklemek genellikle nispeten pahalı bir işlem olduğundan, formatlayıcıyı bir tekil haline getirmenizi tavsiye ederim. (Kullanıcı yazarken hareket halindeyken biçimlendirme yapıyorsanız performansı etkileyebilir.)

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

Uzantısı aracılığıyla bir değişken sağlayacak uzantıda basit bir düşüş Int.

Julien'in cevabında belirtildiği gibi, bu, performans nedenleriyle statik bir biçimlendiriciden yararlanır.

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

Kullanmak için:

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

1
??? Kodunuz Julien'in cevabıyla neredeyse aynı. Tek şey farklı diye sahiptir internal varve sadece var var. Cevabınız sohbete ne katıyor? Ayrıca değişkeninizin delimiteryanıltıcı olduğunu söyleyebilirim . Julien'inki commaRepresentationçok daha kullanışlı.
Zonker.in.Geneva

2

Bu, virgül konumunu ayarlamanın ek bir yoludur. Diyelim ki 10000000 sayısının "1,00,00,000" olarak yazdırılmasını istiyorum

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

1

Swift 4

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

0

Miktar metin alanı için bir sınıf oluşturdum. Bunu metin alanı sınıfınıza ayarlamanız yeterlidir. Ör- 1234567 girin. Bunu 1.234.567'ye dönüştürecek Ayrıca ondalık giriş için çalışacak, ondalıktan sonra iki hane alacaktır.

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)
}}

Hayır NSNumberFormatter kullanıyorum. Ondalık ve diğer doğrulama için ayrı koşullar koydum.
Vijay Patidar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.