【问题标题】:how to add commas to a number in swift?如何在swift中将逗号添加到数字?
【发布时间】:2015-06-24 08:13:29
【问题描述】:

如何将逗号添加到我从 swift 中的 JSON 检索的数字中。

Example
31908551587 to
31,908,551,587

我很困惑,我不知道该怎么办。

【问题讨论】:

    标签: xcode swift


    【解决方案1】:

    你可以用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)
    

    【讨论】:

    • 有什么方法可以使用 NumberFormatter 来做这样的 '31,90,85,51,587' 吗?
    • @SanketBhavsar 我不这么认为check
    • @ÖzgürErsil 我用货币(风格)做到了
    • 如何做反向
    • 有什么方法可以将 1000000000000000 转换为 1,000,000,000,000,000 吗?因为这些适用于数字后的七个 0...
    【解决方案2】:

    扩展 Özgür Ersil 的回答,您可以通过扩展至 Int 来隔离功能:

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

    然后在您的代码上使用:

    largeNumber.withCommas()
    

    【讨论】:

      【解决方案3】:

      还扩展了 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)) ?? ""
          }
      }
      

      【讨论】:

        【解决方案4】:

        一个简单的扩展插件,将通过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 更有用。
        【解决方案5】:

        这是另一种设置逗号位置的方法。假设我希望将数字 10000000 打印为“1,00,00,000”

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

        【讨论】:

        • 当数字包含点 10000000.12 时,此代码不起作用
        【解决方案6】:

        斯威夫特 4

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

        【讨论】:

          【解决方案7】:

          我为金额文本字段创建了一个类。只需将其设置为您的文本字段类。 Ex- 输入 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。对于十进制和其他验证,我设置了单独的条件。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 1970-01-01
          • 1970-01-01
          • 2015-11-03
          • 2018-10-22
          • 2013-10-31
          • 1970-01-01
          相关资源
          最近更新 更多