如何创建具有格式的字符串?


187

我需要创建一个可以将int,long,double等类型转换为字符串的格式的字符串。使用Obj-C,我可以通过以下方式进行操作。

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

怎么做迅速?

Answers:


385

我认为这可以帮助您:

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

结果示例:

timeNow in hex: 5cdc9c8d

1
好答案!这绝对是正确的方法。对于其他用户,请注意,将类方法“ stringWithFormat”转换为对该类的初始化调用,并且将“ WithFormat”转换为已命名的第一个参数“ format:”。最初的问题没有添加任何特定的格式,例如更改要显示的浮点小数位数,如果有的话,唯一的答案是您的!
David H

4
您将链接到文档吗?我无法找到它。
dumbledad

3
这种方法是来自NSStringFoundation框架。因此,您必须import Foundation使其正常工作。否则,表达式将调用String.init<T>(T),并将产生类似的"(\"%@%x %x\", 10)"代替。
尼尔2016年

1
@realityone %@%x符号是什么意思?您能否将我指向一个资源,在这里我可以了解更多信息。
bibscy


90

没什么特别的

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

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

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


6
我不认为这实际上可以回答问题,因为没有格式。使用此方法,您无法格式化浮点数中有多少个小数。使用String(format:arguments:)格式更适合添加格式
克里斯

4
OP不需要任何格式,只是一种创建具有可将int,long,double等类型的格式转换为string的格式的字符串的方法
John Estropia 2015年

当时的问题还不清楚。因为他正在比较想要-stringWithFormat:格式化的内容。在Swift中,String(format:arguments:)将是Obj-C的Swift版本-stringWithFormat:
Chris

检查问题的日期。这是在Swift的第一个发行版中,当时NSString方法尚未在Swift的中实现String
约翰·埃斯特罗皮亚

我站得住了。对于以后寻找相同问题的任何人来说,以新颖的方式显示仍是一件好事
克里斯(Chris)

42

不需要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)

15

我会认为

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

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

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

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

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


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

5

首先阅读Swift语言的官方文档。

答案应该是

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;

这要清楚得多。


2
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);

2
无需使用修饰符。我们也可以不带修饰符使用它。正确,但是长代码。
Gaurav Gilani 2014年

1

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

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/


1

如果您不能导入Foundation,使用round()和/或不想要String,那么我可以通过“ We <3 Swift”学到一个简单的解决方案:

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

结果:31.726


0

使用以下代码:

    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) "

-1

尝试成功:

 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))
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.