làm thế nào để thêm dấu phẩy vào một số nhanh chóng?


85

Làm cách nào để tôi thêm dấu phẩy vào một số mà tôi đang truy xuất nhanh chóng từ JSON.

Example
31908551587 to
31,908,551,587

Tôi rất bối rối và tôi không biết phải làm gì.

Câu trả lời:


169

Bạn có thể làm điều đó với NSNumberFormatter

Swift 4

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

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

có cách nào để làm như thế này '31, 90,85,51,587 'bằng cách sử dụng NumberFormatter không?
Sanket_B

@SanketBhavsar, tôi không nghĩ nên kiểm tra
Özgür Ersil,

2
@ ÖzgürErsil Tôi đã làm điều đó với tiền tệ (phong cách)
Sanket_B

làm thế nào để làm ngược lại
Yestay Muratov

Có cách nào để chuyển đổi 1000000000000000 thành 1,000,000,000,000,000 không ?? Bởi vì những việc bảy 0 sau số ...
Cemal BAYRI

43

Mở rộng dựa trên câu trả lời của Özgür Ersil, bạn có thể tách biệt chức năng với một phần mở rộng cho Int:

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

Sau đó, sử dụng trên mã của bạn như:

largeNumber.withCommas()

12

Cũng mở rộng về câu trả lời của Juan Fran Jimenez, tôi khuyên bạn nên đặt định dạng vào một singleton, vì việc khởi tạo một định dạng thường là một hoạt động tương đối tốn kém. (Nó có thể ảnh hưởng đến hiệu suất nếu bạn đang định dạng khi đang di chuyển khi người dùng viết.)

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

Một phần mở rộng giảm đơn giản sẽ cung cấp một biến thông qua phần mở rộng của Int.

Như đã lưu ý trong câu trả lời của Julien, điều này sử dụng một định dạng tĩnh vì lý do hiệu suất.

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

Để dùng nó:

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

1
??? Mã của bạn thực tế giống với câu trả lời của Julien. Điều duy nhất khác biệt là anh ấy có internal varvà bạn chỉ có var. Câu trả lời của bạn bổ sung điều gì cho cuộc trò chuyện? Ngoài ra, tôi sẽ nói rằng biến của bạn delimitergây hiểu lầm. Julien's commaRepresentationhữu ích hơn nhiều.
Zonker.in.Geneva

2

Đây là một cách bổ sung để đặt vị trí dấu phẩy. Giả sử tôi muốn số 10000000 được in thành "1,00,00,000"

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

Tôi đã tạo một lớp cho trường văn bản số lượng. Đơn giản chỉ cần đặt nó thành lớp textfield của bạn. Ví dụ: Nhập 1234567. Nó sẽ chuyển nó thành 1.234.567 Cũng hoạt động với mục thập phân, sẽ có hai chữ số sau thập phân.

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

Không, tôi đang sử dụng NSNumberFormatter. Đối với số thập phân và xác thực khác, tôi đặt các điều kiện riêng biệt.
Vijay Patidar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.