【问题标题】:Adding Thousand Separator to Int in Swift在 Swift 中向 Int 添加千位分隔符
【发布时间】:2015-07-12 00:03:50
【问题描述】:

我对 Swift 还很陌生,并且很难找到一种方法来添加一个空格作为千​​位分隔符。

我希望实现的是获取计算结果并将其显示在文本字段中,格式为:

2 358 000

而不是

2358000

例如。

我不确定是否应该格式化 Int 值然后将其转换为字符串,或者在将 Int 值转换为字符串后添加空格。任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift separator


    【解决方案1】:

    您可以使用 NSNumberFormatter 指定不同的分组分隔符,如下所示:

    更新:Xcode 11.5 • Swift 5.2

    extension Formatter {
        static let withSeparator: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.groupingSeparator = " "
            return formatter
        }()
    }
    

    extension Numeric {
        var formattedWithSeparator: String { Formatter.withSeparator.string(for: self) ?? "" }
    }
    

    2358000.formattedWithSeparator  // "2 358 000"
    2358000.99.formattedWithSeparator  // "2 358 000.99"
    
    let int = 2358000
    let intFormatted = int.formattedWithSeparator  // "2 358 000"
    
    let decimal: Decimal = 2358000
    let decimalFormatted = decimal.formattedWithSeparator  // "2 358 000"
    
    let decimalWithFractionalDigits: Decimal = 2358000.99
    let decimalWithFractionalDigitsFormatted = decimalWithFractionalDigits.formattedWithSeparator // "2 358 000.99"
    

    如果您需要将您的价值显示为具有当前语言环境或固定语言环境的货币:

    extension Formatter {
        static let number = NumberFormatter()
    }
    extension Locale {
        static let englishUS: Locale = .init(identifier: "en_US")
        static let frenchFR: Locale = .init(identifier: "fr_FR")
        static let portugueseBR: Locale = .init(identifier: "pt_BR")
        // ... and so on
    }
    extension Numeric {
        func formatted(with groupingSeparator: String? = nil, style: NumberFormatter.Style, locale: Locale = .current) -> String {
            Formatter.number.locale = locale
            Formatter.number.numberStyle = style
            if let groupingSeparator = groupingSeparator {
                Formatter.number.groupingSeparator = groupingSeparator
            }
            return Formatter.number.string(for: self) ?? ""
        }
        // Localized
        var currency:   String { formatted(style: .currency) }
        // Fixed locales
        var currencyUS: String { formatted(style: .currency, locale: .englishUS) }
        var currencyFR: String { formatted(style: .currency, locale: .frenchFR) }
        var currencyBR: String { formatted(style: .currency, locale: .portugueseBR) }
        // ... and so on
        var calculator: String { formatted(groupingSeparator: " ", style: .decimal) }
    }
    

    用法:

    1234.99.currency    // "$1,234.99"
    
    1234.99.currencyUS  // "$1,234.99"
    1234.99.currencyFR  // "1 234,99 €"
    1234.99.currencyBR  // "R$ 1.234,99"
    
    1234.99.calculator  // "1 234.99"
    

    注意:如果您想拥有一个与句号宽度相同的空格,您可以使用"\u{2008}"

    unicode spaces

    formatter.groupingSeparator = "\u{2008}"
    

    【讨论】:

    • 不要设置分隔符,让格式化程序根据语言环境选择一个。
    • @Sulthan 没有任何语言环境会给他半角空间
    • 你能帮我把这个添加到textField,怎么做?当我们输入文本字段数字应该改变(千后添加空格)
    • @Аба-БакриИбрагимов stackoverflow.com/a/34294660/2303865
    【解决方案2】:

    你想使用NSNumberFormatter:

    let fmt = NSNumberFormatter()
    fmt.numberStyle = .DecimalStyle
    fmt.stringFromNumber(2358000)  // with my locale, "2,358,000"
    fmt.locale = NSLocale(localeIdentifier: "fr_FR")
    fmt.stringFromNumber(2358000)  // "2 358 000"
    

    【讨论】:

    • 我不知道法国(或任何国家,就此而言)使用空格作为分隔符。我最喜欢的风格一直是每 3 位数的空格,整数部分和小数部分之间的句点......我从一本旧数学书上捡到它,从未见过它在其他任何地方使用过......这正是法国人所做的吗?
    • @ArtOfWarfare 许多语言使用逗号作为小数分隔符,但千位分隔符在空格和句点之间有所不同(例如,法语和德语使用空格,西班牙语和意大利语使用句点)。我认为英语是少数(可能是一种?)使用句点作为小数。
    • @AirspeedVelocity 实际上,在德语中,使用句点 (.) 作为千位分隔符和逗号 (,) 作为小数点分隔符。所以英语的 1,234.56 是德语的 1.234,56。
    • 意大利:句点代表千 (1.000),逗号代表小数。这突出了让格式化程序格式化格式并自己格式化格式化程序的必要性。
    【解决方案3】:

    Leo Dabus 的回答翻译成 Swift 3

    进入任何.swift 文件,在一个类之外:

    struct Number {
        static let withSeparator: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.groupingSeparator = " " // or possibly "." / ","
            formatter.numberStyle = .decimal
            return formatter
        }()
    }
    extension Integer {
        var stringWithSepator: String {
            return Number.withSeparator.string(from: NSNumber(value: hashValue)) ?? ""
        }
    }
    

    用法:

    let myInteger = 2358000
    let myString = myInteger.stringWithSeparator  // "2 358 000"
    

    【讨论】:

      【解决方案4】:

      使用 Swift 5,当您需要格式化数字的显示时,NumberFormatter 是正确的工具。


      NumberFormatter 有一个名为numberStyle 的属性。 numberStyle 可以设置为 NumberFormatter.Style.decimal 的值,以便将格式化程序的样式设置为十进制。

      因此,在最简单的情况下,当您想用十进制样式格式化数字时,您可以使用以下 Playground 代码:

      import Foundation
      
      let formatter = NumberFormatter()
      formatter.numberStyle = NumberFormatter.Style.decimal
      
      let amount = 2358000
      let formattedString = formatter.string(for: amount)
      print(String(describing: formattedString))
      

      根据用户当前的语言环境,此代码将打印Optional("2,358,000") 代表en_USOptional("2 358 000") 代表fr_FR


      请注意,使用NumberFormatterlocale 属性设置为Locale.current 的以下代码sn-p 等效于前面的Playground 代码:

      import Foundation
      
      let formatter = NumberFormatter()
      formatter.numberStyle = .decimal
      formatter.locale = Locale.current
      
      let amount = 2358000
      let formattedString = formatter.string(for: amount)
      print(String(describing: formattedString))
      

      下面使用NumberFormattergroupingSeparator 属性设置为Locale.current.groupingSeparator 的Playground 代码也等同于前者:

      import Foundation
      
      let formatter = NumberFormatter()
      formatter.numberStyle = .decimal
      formatter.groupingSeparator = Locale.current.groupingSeparator
      
      let amount = 2358000
      let formattedString = formatter.string(for: amount)
      print(String(describing: formattedString))
      

      否则,如果您想使用特定区域设置格式设置数字格式,您可以使用以下 Playground 代码:

      import Foundation
      
      let formatter = NumberFormatter()
      formatter.numberStyle = .decimal
      formatter.locale = Locale(identifier: "fr_FR")
      
      let amount = 2358000
      let formattedString = formatter.string(for: amount)
      print(String(describing: formattedString))
      // prints: Optional("2 358 000")
      

      但是,如果您真正想要的是强制执行特定的分组分隔符,您可以使用下面的 Playground 代码:

      import Foundation
      
      let formatter = NumberFormatter()
      formatter.numberStyle = .decimal
      formatter.groupingSeparator = " "
      
      let amount = 2358000
      let formattedString = formatter.string(for: amount)
      print(String(describing: formattedString))
      // prints: Optional("2 358 000")
      

      【讨论】:

        【解决方案5】:

        试试这个

        func addPoints(inputNumber: NSMutableString){
            var count: Int = inputNumber.length
            while count >= 4 {
                count = count - 3
                inputNumber.insert(" ", at: count) // you also can use "," 
            }
            print(inputNumber)
        }
        

        电话:

        addPoints(inputNumber: "123456")
        

        结果:

        123 456(或 123,456)

        【讨论】:

          【解决方案6】:

          我正在寻找像 $100,000.00 这样的货币格式 我完成了它像这样自定义实现 Leo Dabus

          extension Formatter {
              static let withSeparator: NumberFormatter = {
                  let formatter = NumberFormatter()
                  formatter.numberStyle = .currency
                  formatter.currencyGroupingSeparator = ","
                  formatter.locale = Locale(identifier: "en_US") //for USA's currency patter
                  return formatter
              }()
          }
          
          extension Numeric {
              var formattedWithSeparator: String {
                  return Formatter.withSeparator.string(for: self) ?? ""
              }
          }
          

          【讨论】:

          • 您应该在设置其他属性之前设置语言环境。顺便说一句,如果您将区域设置固定为“en_US”,则无需设置currencyGroupingSeparator。
          【解决方案7】:

          代码:

          //5000000
          let formatter = NumberFormatter()
          formatter.groupingSeparator = " "
          formatter.locale = Locale(identifier: "en_US")
          formatter.numberStyle = .decimal. 
          

          输出:

          5 000 000

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-12
            • 2021-04-19
            • 2016-04-06
            • 2018-10-25
            • 2023-03-30
            相关资源
            最近更新 更多