วิธีเพิ่มเครื่องหมายจุลภาคให้กับตัวเลขอย่างรวดเร็ว?


87

ฉันจะเพิ่มเครื่องหมายจุลภาคให้กับตัวเลขที่ฉันดึงมาจาก JSON อย่างรวดเร็วได้อย่างไร

Example
31908551587 to
31,908,551,587

ฉันสับสนและไม่รู้จะทำอย่างไร

คำตอบ:


171

คุณสามารถทำได้ด้วย 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)

มีวิธีใดบ้างในการทำเช่นนี้ '31, 90,85,51,587 'โดยใช้ NumberFormatter
Sanket_B

@SanketBhavsar ฉันไม่คิดอย่างนั้นตรวจสอบ
Özgür Ersil

2
@ ÖzgürErsilฉันทำด้วยสกุลเงิน (สไตล์)
Sanket_B

วิธีการย้อนกลับ
Yestay Muratov

มีวิธีใดบ้างที่จะแปลง 1000000000000000 เป็น 1,000,000,000,000,000 ?? เพราะสิ่งเหล่านี้ทำงานเป็น 0 เจ็ดหลังหมายเลข ...
Cemal BAYRI

48

การขยายคำตอบของÖ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 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 สำหรับการตรวจสอบทศนิยมและอื่น ๆ ฉันใส่เงื่อนไขแยกต่างหาก
Vijay Patidar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.