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ì.
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:
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)
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()
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)) ?? ""
}
}
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
internal var
và 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 delimiter
gây hiểu lầm. Julien's commaRepresentation
hữu ích hơn nhiều.
Đâ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)
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)
}}