Jak utworzyć ciąg znaków w formacie?

187

Muszę utworzyć ciąg znaków w formacie, który może konwertować typy int, long, double itp. Na string. Za pomocą Obj-C mogę to zrobić poniżej.

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

Jak zrobić to samo z szybkim?

Apurv
źródło

Odpowiedzi:

386

Myślę, że to może ci pomóc:

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

Przykładowy wynik:

timeNow in hex: 5cdc9c8d
realityoneone
źródło
1
Świetna odpowiedź! To jest absolutnie właściwy sposób na zrobienie tego. W przypadku innych należy zauważyć, że metoda klasy „stringWithFormat” zostaje przekonwertowana na wywołanie init klasy, a „WithFormat” zamienia się w nazwany pierwszy argument „format:”. Oryginalne pytanie nie dodało żadnego konkretnego formatowania, takiego jak zmiana liczby miejsc po przecinku do wyświetlenia, gdyby tak było, Twoja byłaby jedyną odpowiedzią!
David H
4
Czy link do dokumentacji? Mam problem z wyśledzeniem tego.
dumbledad
3
Metoda ta pochodzi NSStringw Foundationramach . Musisz więc import Foundationsprawić, by działało poprawnie. W przeciwnym razie wyrażenie zadzwoni String.init<T>(T)i wytworzy coś podobnego "(\"%@%x %x\", 10)"zamiast.
eonil
1
@realityone co %@%xoznaczają symbole? Czy możesz wskazać mi zasób, w którym mogę dowiedzieć się więcej na ten temat?
bibscy
90

nic specjalnego

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

Aktualizacja: Napisałem tę odpowiedź, zanim Swift String(format:)dodał do swojego API. Użyj metody podanej w górnej odpowiedzi .

John Estropia
źródło
6
Nie sądzę, że to faktycznie odpowiada na pytanie, ponieważ nie ma formatowania. Za pomocą tej metody nie można sformatować liczby miejsc dziesiętnych w liczbach zmiennoprzecinkowych. Zastosowanie String(format:arguments:)byłoby bardziej odpowiednie do dodania formatowania
Chris
4
OP nie poprosił o żadne formatowanie, tylko sposób na utworzenie łańcucha z formatem, który może konwertować typy int, long, double itp . Na łańcuch .
John Estropia,
Pytanie jest zatem niejasne. Ponieważ porównuje to, czego chce, -stringWithFormat:co pozwala na formatowanie. W Swift String(format:arguments:)byłaby szybka wersja Obj-C-stringWithFormat:
Chris
Sprawdź datę pytania. Było to podczas pierwszego wydania Swift, kiedy NSStringmetody nie zostały jeszcze zaimplementowane w Swift String.
John Estropia
Poprawiono mnie. Nadal dobrze jest widzieć nowszą drogę dla każdego, kto szuka tego samego problemu w przyszłości
Chris
42

Nie NSStringwymagane!

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

lub

String(format:"Value: %3.2f\tResult: %3.2f", 2.7, 99.8)
Durul Dalkanat
źródło
15

Twierdziłbym, że jedno i drugie

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

i

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

są dopuszczalne, ponieważ użytkownik zapytał o formatowanie, a oba przypadki pasują do tego, o co proszą:

Muszę utworzyć ciąg znaków w formacie, który może konwertować typy int, long, double itp. Na string.

Oczywiście ta pierwsza umożliwia lepszą kontrolę nad formatowaniem niż druga, ale to nie znaczy, że druga nie jest akceptowalną odpowiedzią.

Lance Clark
źródło
5
var str = "\(INT_VALUE) , \(FLOAT_VALUE) , \(DOUBLE_VALUE), \(STRING_VALUE)"
jabłko
źródło
5

Najpierw przeczytaj oficjalną dokumentację dla języka Swift.

Odpowiedź powinna być

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

Tutaj

1) Domyślnie dowolna wartość zmiennoprzecinkowa double

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

-> Jeśli chcesz wyświetlić wartość zmiennoprzecinkową, musisz jawnie zdefiniować takie jak

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

Jest to o wiele bardziej jasne.

iPatel
źródło
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
źródło
2
nie ma potrzeby używania modyfikatorów. Możemy go również używać bez modyfikatorów. To prawda, ale długi kod.
Gaurav Gilani
1

Wiem, że minęło dużo czasu od tej publikacji, ale wpadłem w podobną sytuację i stworzyłem klasę uproszczoną, aby uprościć moje życie.

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
    }

}

Poniższy link wyślij do pełnego kodu źródłowego: https://gist.github.com/dedeexe/d9a43894081317e7c418b96d1d081b25

To rozwiązanie zostało oparte na tym artykule: http://vojtastavik.com/2015/03/29/real-time-formatting-in-uitextfield-swift-basics/

dede.exe
źródło
1

Jest proste rozwiązanie, którego nauczyłem się z „We <3 Swift”, jeśli nie możesz zaimportować Foundation , użyć round () i / lub nie chcesz String :

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

wynik: 31,726

Paula Hasstenteufel
źródło
0

Użyj następującego kodu:

    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
źródło
-2

Sukces, aby spróbować:

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

źródło