Como criar uma string com formato?

187

Eu preciso criar uma string com formato que possa converter tipos int, long, double etc. em string. Usando Obj-C, eu posso fazer isso abaixo.

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

Como fazer o mesmo com o swift?

Apurv
fonte

Respostas:

386

Eu acho que isso poderia ajudá-lo:

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

Resultado de exemplo:

timeNow in hex: 5cdc9c8d
realityone
fonte
1
Ótima resposta! Esta é absolutamente a maneira correta de fazer isso. Para outros, observe que o método de classe "stringWithFormat" é convertido em uma chamada init na classe com o "WithFormat" transformado em um primeiro argumento nomeado de "formato:". A pergunta original não adicionou nenhuma formatação específica, como alterar o número de casas decimais de ponto flutuante para exibir, se ele tivesse, a sua seria a única resposta!
David H
4
Você ligaria para a documentação? Estou tendo problemas para localizar.
dumbledad
3
Este método está vindo NSStringno Foundationquadro . Então você precisa import Foundationfazer isso funcionar corretamente. Caso contrário, a expressão chamará String.init<T>(T)e produzirá algo como em "(\"%@%x %x\", 10)"vez de.
eonil
1
@realityone O que %@%xsignificam símbolos? Você pode me indicar um recurso em que eu possa aprender mais sobre isso?
bibscy
90

nada especial

let str = NSString(format:"%d , %f, %ld, %@", INT_VALUE, FLOAT_VALUE, LONG_VALUE, STRING_VALUE)
Bryan Chen
fonte
49
let str = "\(INT_VALUE), \(FLOAT_VALUE), \(DOUBLE_VALUE), \(STRING_VALUE)"

Atualização: escrevi esta resposta antes que o Swift fosse String(format:)adicionado à sua API. Use o método fornecido pela resposta superior .

John Estropia
fonte
6
Eu não acho que isso realmente responda à pergunta porque não há formatação. Usando esse método, você não pode formatar quantas casas decimais devem ter em seus pontos flutuantes. Usando String(format:arguments:)seria mais apropriado para adicionar formatação
Chris
4
O OP não pediu nenhuma formatação, apenas uma maneira de criar uma string com um formato que possa converter tipos int, long, double etc. em string .
John Estropia
A questão não está clara então. Porque ele está comparando o que quer com o -stringWithFormat:que permite a formatação. Em Swift, String(format:arguments:)seria a versão Swift dos Obj-C's-stringWithFormat:
Chris
Verifique a data da pergunta. Isso foi durante o primeiro lançamento do Swift, quando os NSStringmétodos ainda não foram implementados no Swift String.
John Estropia
Eu estou corrigido. Ainda bom ter a nova maneira visível para quem procura o mesmo problema no futuro
Chris
42

Não é NSStringnecessário!

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

ou

String(format:"Value: %3.2f\tResult: %3.2f", 2.7, 99.8)
Durul Dalkanat
fonte
15

Eu argumentaria que ambos

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

e

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

são aceitáveis, pois o usuário perguntou sobre formatação e os dois casos se encaixam no que estão solicitando:

Eu preciso criar uma string com formato que possa converter tipos int, long, double etc. em string.

Obviamente, o primeiro permite um controle mais preciso sobre a formatação do que o último, mas isso não significa que o último não seja uma resposta aceitável.

Lance Clark
fonte
5
var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"
maçã
fonte
5

Leia primeiro a documentação oficial para o idioma Swift.

A resposta deve ser

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

Aqui

1) Qualquer valor de ponto flutuante por padrão double

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

-> Se você deseja exibir o valor do ponto flutuante, precisa definir explicitamente como um

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

Isso é muito mais claro.

iPatel
fonte
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);
Awais Chatha
fonte
2
não há necessidade de usar os modificadores. Também podemos usá-lo sem os modificadores. Está certo, mas o código longo.
Gaurav Gilani
1

Sei que já passou muito tempo desde a publicação, mas caí em uma situação semelhante e criei uma classe simples para simplificar minha vida.

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
    }

}

O link a seguir é enviado para o código-fonte completo: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

Esta solução foi baseada neste artigo: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/

dede.exe
fonte
1

Há uma solução simples que aprendi com "We <3 Swift" se você não pode importar o Foundation , use round () e / ou não deseja uma String :

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

resultado: 31.726

Paula Hasstenteufel
fonte
0

Use este código a seguir:

    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) "
PREMKUMAR
fonte
-2

Sucesso ao tentar:

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

fonte