【问题标题】:How to create a String with format?如何创建具有格式的字符串?
【发布时间】:2014-07-27 06:57:31
【问题描述】:

我需要创建一个String,其格式可以将IntInt64Double等类型转换为String。使用Objective-C,我可以通过以下方式完成:

NSString *str = [NSString stringWithFormat:@"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE, STRING_VALUE];

Wwift 怎么做?

【问题讨论】:

    标签: ios swift ios8 string-formatting


    【解决方案1】:

    我认为这可以帮助你:

    let timeNow = time(nil)
    let aStr = String(format: "%@%x", "timeNow in hex: ", timeNow)
    print(aStr)
    

    示例结果:

    timeNow in hex: 5cdc9c8d
    

    【讨论】:

    • 很好的答案!这绝对是正确的做法。对于其他人,请注意类方法“stringWithFormat”被转换为对类的 init 调用,“WithFormat”变成了“format:”的命名第一个参数。原始问题没有添加任何特定格式,例如更改要显示的浮点小数位数,如果有,您将是唯一的答案!
    • 你会链接到文档吗?我无法追踪它。
    • 此方法来自NSString in Foundation framework。所以你必须import Foundation 才能使它正常工作。否则表达式将调用 String.init<T>(T) ,它会产生类似 "(\"%@%x %x\", 10)" 的东西而不是。
    • @realityone %@%x 符号是什么意思?你能指出我可以了解更多信息的资源吗?
    【解决方案2】:

    没什么特别的

    let str = NSString(format:"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, LONG_VALUE, STRING_VALUE)
    

    【讨论】:

      【解决方案3】:
      let str = "\(INT_VALUE), \(FLOAT_VALUE), \(DOUBLE_VALUE), \(STRING_VALUE)"
      

      更新:我在 Swift 将 String(format:) 添加到它的 API 之前写了这个答案。使用top answer给出的方法。

      【讨论】:

      • 我不认为这实际上回答了这个问题,因为没有格式。使用此方法,您无法格式化浮点数中的小数位数。使用String(format:arguments:) 会更适合添加格式
      • OP 没有要求任何格式,只是一种创建具有可以将 int、long、double 等类型转换为字符串的格式的字符串的方法。。跨度>
      • 那么问题就不清楚了。因为他将他想要的内容与允许格式化的-stringWithFormat: 进行比较。在 Swift 中,String(format:arguments:) 将是 Obj-C 的 -stringWithFormat: 的 Swift 版本
      • 检查问题的日期。这是在 Swift 的第一个版本期间,NSString 方法尚未在 Swift 的 String 中实现。
      • 我的立场是正确的。对于将来搜索相同问题的任何人来说,仍然可以看到更新的方法
      【解决方案4】:

      不需要NSString

      String(format: "Value: %3.2f\tResult: %3.2f", arguments: [2.7, 99.8])
      

      String(format:"Value: %3.2f\tResult: %3.2f", 2.7, 99.8)
      

      【讨论】:

        【解决方案5】:

        我认为两者都

        let str = String(format:"%d, %f, %ld", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE)
        

        let str = "\(INT_VALUE), \(FLOAT_VALUE), \(DOUBLE_VALUE)"
        

        都是可以接受的,因为用户询问了格式并且两种情况都符合他们的要求:

        我需要创建一个可以将 int、long、double 等类型转换为字符串的格式的字符串。

        显然,前者比后者可以更好地控制格式,但这并不意味着后者不是可接受的答案。

        【讨论】:

        • STRING_VALUE 怎么样:Swift 字符串应该使用哪个格式化符号,是否与 NSString-s 的情况相同(即 %@)?
        【解决方案6】:

        初读Official documentation for Swift language.

        答案应该是

        var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"
        println(str)
        

        这里

        1) 默认任意浮点值double

        EX.
         var myVal = 5.2 // its double by default;
        

        ->如果你想显示浮点值那么你需要明确定义这样的一个

         EX.
             var myVal:Float = 5.2 // now its float value;
        

        这要清楚得多。

        【讨论】:

          【解决方案7】:
          let INT_VALUE=80
          let FLOAT_VALUE:Double= 80.9999
          let doubleValue=65.0
          let DOUBLE_VALUE:Double= 65.56
          let STRING_VALUE="Hello"
          
          let str = NSString(format:"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, DOUBLE_VALUE, STRING_VALUE);
           println(str);
          

          【讨论】:

          • 不需要使用修饰符。我们也可以在没有修饰符的情况下使用它。没错,就是代码太长了。
          【解决方案8】:

          我知道自此发布以来已经过去了很多时间,但我也陷入了类似的境地并创建了一个 simples 类来简化我的生活。

          public struct StringMaskFormatter {
          
              public var pattern              : String    = ""
              public var replecementChar      : Character = "*"
              public var allowNumbers         : Bool      = true
              public var allowText            : Bool      = false
          
          
              public init(pattern:String, replecementChar:Character="*", allowNumbers:Bool=true, allowText:Bool=true)
              {
                  self.pattern            = pattern
                  self.replecementChar    = replecementChar
                  self.allowNumbers       = allowNumbers
                  self.allowText          = allowText
              }
          
          
              private func prepareString(string:String) -> String {
          
                  var charSet : NSCharacterSet!
          
                  if allowText && allowNumbers {
                      charSet = NSCharacterSet.alphanumericCharacterSet().invertedSet
                  }
                  else if allowText {
                      charSet = NSCharacterSet.letterCharacterSet().invertedSet
                  }
                  else if allowNumbers {
                      charSet = NSCharacterSet.decimalDigitCharacterSet().invertedSet
                  }
          
                  let result = string.componentsSeparatedByCharactersInSet(charSet)
                  return result.joinWithSeparator("")
              }
          
              public func createFormattedStringFrom(text:String) -> String
              {
                  var resultString = ""
                  if text.characters.count > 0 && pattern.characters.count > 0
                  {
          
                      var finalText   = ""
                      var stop        = false
                      let tempString  = prepareString(text)
          
                      var formatIndex = pattern.startIndex
                      var tempIndex   = tempString.startIndex
          
                      while !stop
                      {
                          let formattingPatternRange = formatIndex ..< formatIndex.advancedBy(1)
          
                          if pattern.substringWithRange(formattingPatternRange) != String(replecementChar) {
                              finalText = finalText.stringByAppendingString(pattern.substringWithRange(formattingPatternRange))
                          }
                          else if tempString.characters.count > 0 {
                              let pureStringRange = tempIndex ..< tempIndex.advancedBy(1)
                              finalText = finalText.stringByAppendingString(tempString.substringWithRange(pureStringRange))
                              tempIndex = tempIndex.advancedBy(1)
                          }
          
                          formatIndex = formatIndex.advancedBy(1)
          
                          if formatIndex >= pattern.endIndex || tempIndex >= tempString.endIndex {
                              stop = true
                          }
          
                          resultString = finalText
          
                      }
                  }
          
                  return resultString
              }
          
          }
          

          以下链接发送到完整的源代码: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

          此解决方案基于这篇文章: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/

          【讨论】:

            【解决方案9】:

            如果您不能 import Foundation、使用 round() 和/或不想要,我通过“We 字符串:

            var number = 31.726354765
            var intNumber = Int(number * 1000.0)
            var roundedNumber = Double(intNumber) / 1000.0
            

            结果:31.726

            【讨论】:

              【解决方案10】:

              使用以下代码:

                  let intVal=56
                  let floatval:Double=56.897898
                  let doubleValue=89.0
                  let explicitDaouble:Double=89.56
                  let stringValue:"Hello"
              
                  let stringValue="String:\(stringValue) Integer:\(intVal) Float:\(floatval) Double:\(doubleValue) ExplicitDouble:\(explicitDaouble) "
              

              【讨论】:

                【解决方案11】:

                String(format:) 的美妙之处在于,您可以保存格式化字符串,然后在以后的许多地方重复使用它。它也可以在这个单一的地方进行本地化。在插值方法的情况下,您必须一次又一次地编写它。

                【讨论】:

                  【解决方案12】:

                  简单的功能不包含在 Swift 中,因为它包含在其他语言中,所以通常可以快速编码以供重用。程序员创建包含所有这些重用代码的技巧文件包的专业提示。

                  所以从我的技巧包中,我们首先需要在缩进中使用字符串乘法。

                  @inlinable func * (string: String, scalar: Int) -> String {
                      let array = [String](repeating: string, count: scalar)
                      return array.joined(separator: "")
                  }
                  

                  然后是添加逗号的代码。

                  extension Int {
                      @inlinable var withCommas:String {
                          var i = self
                          var retValue:[String] = []
                          while i >= 1000 {
                              retValue.append(String(format:"%03d",i%1000))
                              i /= 1000
                          }
                          retValue.append("\(i)")
                          return retValue.reversed().joined(separator: ",")
                      }
                  
                      @inlinable func withCommas(_ count:Int = 0) -> String {
                          let retValue = self.withCommas
                          let indentation = count - retValue.count
                          let indent:String = indentation >= 0 ? " " * indentation : ""
                  
                          return indent + retValue
                      }
                  }
                  

                  我刚刚编写了最后一个函数,以便让列对齐。

                  @inlinable 很棒,因为它需要小函数并减少它们的功能,因此它们运行得更快。

                  您可以使用变量版本,也可以使用函数版本来获得固定列。设置小于所需列的长度只会扩展字段。

                  现在你有了一个纯 Swift 的东西,并且不依赖于 NSString 的一些旧的目标 C 例程。

                  【讨论】:

                    【解决方案13】:

                    尝试成功:

                     var letters:NSString = "abcdefghijkl"
                            var strRendom = NSMutableString.stringWithCapacity(strlength)
                            for var i=0; i<strlength; i++ {
                                let rndString = Int(arc4random() % 12)
                                //let strlk = NSString(format: <#NSString#>, <#CVarArg[]#>)
                                let strlk = NSString(format: "%c", letters.characterAtIndex(rndString))
                                strRendom.appendString(String(strlk))
                            }
                    

                    【讨论】:

                      猜你喜欢
                      • 2013-11-08
                      • 2013-02-27
                      • 2020-11-22
                      • 2017-04-25
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-03-23
                      • 1970-01-01
                      • 2021-03-30
                      相关资源
                      最近更新 更多