ฉันจะเพิ่มเครื่องหมายจุลภาคให้กับตัวเลขที่ฉันดึงมาจาก JSON อย่างรวดเร็วได้อย่างไร
Example
31908551587 to
31,908,551,587
ฉันสับสนและไม่รู้จะทำอย่างไร
ฉันจะเพิ่มเครื่องหมายจุลภาคให้กับตัวเลขที่ฉันดึงมาจาก 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
internal var
var
คำตอบของคุณเพิ่มอะไรในการสนทนา? นอกจากนี้ฉันจะบอกว่าตัวแปรของคุณdelimiter
ทำให้เข้าใจผิด Julien commaRepresentation
มีประโยชน์กว่ามาก
นี่เป็นวิธีเพิ่มเติมในการตั้งค่าตำแหน่งลูกน้ำ สมมติว่าฉันต้องการให้ตัวเลข 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)
}}