【问题标题】:Formatting Numbers in Swift 3在 Swift 3 中格式化数字
【发布时间】:2017-06-19 12:34:06
【问题描述】:

我想将数字格式化为:123234234234 中的 123.234.234.234 取决于用户在文本字段中键入的内容。 我不想管理货币,这与货币无关,它是关于用户必须输入一个数字,并且该数字的格式应正确以便于阅读。

不带逗号,带点。

我在整个研究中只发现了货币的东西

【问题讨论】:

标签: swift numbers nsnumberformatter


【解决方案1】:

你要找的可能是groupingSeparatorNumberFormatter

let formater = NumberFormatter()
formater.groupingSeparator = "."
formater.numberStyle = .decimal
let formattedNumber = formater.string(from: number)

【讨论】:

  • 你需要在string(from:)方法中将number转换成NSNumber
  • @paper1111 我没有在我的 snipper 中声明 number 变量,因为我猜函数 string from 描述性足够
【解决方案2】:

实际上有更简单的解决方案(无需创建NumberFormatter 实例),它考虑了用户的语言:

let result = String(format: "%ld %@", locale: Locale.current, viewCount, "views")

值为 1000000 的英文结果:

1,000,000

俄语:

1 000 000

附言在 Android 中是完全一样的String.format(Locale.getDefault(), "%,d %s", viewCount, "views")

【讨论】:

    【解决方案3】:

    您可以使用NumberFormatter

    let yourNumber = 123234234234 
    let numberFormatter = NumberFormatter()
    numberFormatter.numberStyle = NumberFormatter.Style.decimal
    numberFormatter.groupingSeparator = "."
    let formattedNumber = numberFormatter.string(from: NSNumber(value:yourNumber))
    

    【讨论】:

      【解决方案4】:

      详情

      • Xcode 9.2,Swift 4
      • Xcode 10.2 (10E125)、Swift 5

      解决方案

      import Foundation
      
      extension String { var toLocale: Locale { return Locale(identifier: self) } }
      
      extension NumberFormatter {
          convenience init(numberStyle: NumberFormatter.Style, groupingSeparator: String?, decimalSeparator: String?) {
              self.init()
              set(numberStyle: numberStyle, groupingSeparator: groupingSeparator, decimalSeparator: decimalSeparator)
          }
      
          convenience init(numberStyle: NumberFormatter.Style, locale: Locale) {
              self.init()
              set(numberStyle: numberStyle, locale: locale)
          }
      
          func set(numberStyle: NumberFormatter.Style, groupingSeparator: String?, decimalSeparator: String?) {
              self.locale = nil
              self.numberStyle = numberStyle
              self.groupingSeparator = groupingSeparator
              self.decimalSeparator = decimalSeparator
          }
      
          func set(numberStyle: NumberFormatter.Style, locale: Locale?) {
              self.numberStyle = numberStyle
              self.locale = locale
          }
      }
      
      extension Numeric {
          func format(formatter: NumberFormatter) -> String? {
              if let num = self as? NSNumber { return formatter.string(from: num) }
              return nil
          }
      }
      

      用法

      let formatter = NumberFormatter(numberStyle: .decimal, locale: "fr_FR".toLocale)
      print(value.format(formatter: formatter))
      
      formatter.set(numberStyle: .decimal, groupingSeparator: " ", decimalSeparator: ".")
      print(value.format(formatter: formatter))
      

      完整样本

      别忘了在此处添加解决方案代码

      func test<T: Numeric>(value: T) {
          print("=========================================================")
          print("\(T.self), value = \(value)")
      
          let formatter = NumberFormatter(numberStyle: .decimal, locale: "fr_FR".toLocale)
          print(value.format(formatter: formatter) ?? "nil")
          formatter.set(numberStyle: .currency, locale: "de_DE".toLocale)
          print(value.format(formatter: formatter)  ?? "nil")
          formatter.set(numberStyle: .decimal, groupingSeparator: " ", decimalSeparator: ".")
          print(value.format(formatter: formatter)  ?? "nil")
      }
      
      func print(title: String, value: String?) {
          if let value = value { print("\(title) \(value)") }
      }
      
      test(value: Int(10000))
      test(value: Double(10000.231))
      test(value: Float(10000.231))
      

      结果

      =========================================================
      Int, value = 10000
      10 000
      10.000,00 €
      10 000
      =========================================================
      Double, value = 10000.231
      10 000,231
      10.000,23 €
      10 000.231
      =========================================================
      Float, value = 10000.231
      10 000,231
      10.000,23 €
      10 000.231
      

      【讨论】:

        【解决方案5】:

        斯威夫特 4

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

        【讨论】:

          【解决方案6】:

          对于前导零(Swift 5.2)

          String(format: "%02d", intNumber) // 6 -> "06"
          String(format: "%03d", intNumber) // 66 -> "066"
          String(format: "%04d", intNumber) // 666 -> "0666"
          

          来自:https://stackoverflow.com/a/25566860/1064316

          【讨论】:

            【解决方案7】:

            对于 swift 4,我实现了一个扩展,我可以在其中选择格式或在未选择格式时使用默认格式。

            extension Int {
                func formatnumber(groupingSeparator: String?) -> String {
                    let formater = NumberFormatter()
                    formater.groupingSeparator = (groupingSeparator != nil) ? groupingSeparator! : ","
                    formater.numberStyle = .decimal
                    return formater.string(from: NSNumber(value: self))!
                }
            }
            

            【讨论】:

              【解决方案8】:

              以我的脚本为例:

              1) 为项目添加扩展

              extension String {
              
                  public func subString(startIndex: String.Index, endIndex: String.Index) -> String {
                      return String(self[startIndex...endIndex])
                  }
              
                  public func subString(_ from: Int, _ to: Int) -> String {
                        let startIndex = self.index(self.startIndex, offsetBy: from)
                        let endIndex = self.index(self.startIndex, offsetBy: to)
                      return String(self[startIndex...endIndex])
                  }
              }
              

              2) 创建文件 Utilites.swift 并添加我的方法

              public func  priceNumFormat(_ number: String)->String{
              
                  var formattedNumber = number
                  var print = number
                  var prefix = ""
              
                  if number.range(of:"-") != nil {
                      let index = number.index(of:"-")
                      formattedNumber.remove(at: index ?? formattedNumber.endIndex)
                      prefix = "-"
                  }
              
              
                  if formattedNumber.range(of:".") != nil {
                      let index = formattedNumber.index(of:".")
                      formattedNumber =  formattedNumber.subString(startIndex: formattedNumber.startIndex, endIndex: index ?? formattedNumber.endIndex)
                      formattedNumber.remove(at: index ?? formattedNumber.endIndex)
                  }
              
                  if formattedNumber.count == 8 //10 000 000
                  {
                     let num0 = formattedNumber.subString(0, 1)
                     let num1 = formattedNumber.subString(2, 4)
                     let num2 = formattedNumber.subString(5, 7)
                     print =  "\(num0) \(num1) \(num2)"
                  }
              
                  if formattedNumber.count == 7 //1 000 000
                  {
                      let num0 = formattedNumber.subString(0, 0)
                      let num1 = formattedNumber.subString(1, 3)
                      let num2 = formattedNumber.subString(4, 6)
                      print =  "\(num0) \(num1) \(num2)"
                  }
              
                  if formattedNumber.count == 6 //100 000
                  {
                      let num0 = formattedNumber.subString(0, 2)
                      let num1 = formattedNumber.subString(3, 5)
                      print =  "\(num0) \(num1)"
                  }
              
                  if formattedNumber.count == 5 //10 000
                  {
                      let num0 = formattedNumber.subString(0, 1)
                      let num1 = formattedNumber.subString(2, 4)
                      print =  "\(num0) \(num1)"
                  }
              
                  if formattedNumber.count == 4 //1 000
                  {
                      let num0 = formattedNumber.subString(0, 0)
                      let num1 = formattedNumber.subString(1, 3)
                      print =  "\(num0) \(num1)"
                  }
              
                  if formattedNumber.count == 3 //100
                  {
                      print =  formattedNumber
                  }
              
                  if prefix.count > 0
                  {
                      print = "- \(print)"
                  }
              
                  return print;
              }
              

              3) 在你的 UIController 中添加代码

               let utils = Utilites()
                          private func test(){
                              var price =  self.utils.priceNumFormat("-12345678.000")
                              print("\(price)") //-12 345 678
                              price =  self.utils.priceNumFormat("-1234567.000")
                              print("\(price)") //-1 234 567
                              price =  self.utils.priceNumFormat("-123456.000")
                              print("\(price)") //-123 456
                              price =  self.utils.priceNumFormat("-12345.000")
                              print("\(price)") //-12 345
                              price =  self.utils.priceNumFormat("-1234.000")
                              print("\(price)") //-1 234
                              price =  self.utils.priceNumFormat("-123.000")
                              print("\(price)") //-123
              
                          }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-02-10
                • 1970-01-01
                • 2021-07-09
                • 2023-03-29
                相关资源
                最近更新 更多