Как создать строку с форматом?


187

Мне нужно создать строку с форматом, который может конвертировать типы int, long, double и т. Д. В строку. Используя Obj-C, я могу сделать это следующим образом.

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

Как сделать то же самое с Swift?

Ответы:


386

Я думаю, что это может помочь вам:

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

Пример результата:

timeNow in hex: 5cdc9c8d

1
Отличный ответ! Это абсолютно правильный способ сделать это. Для других, обратите внимание, что метод класса «stringWithFormat» преобразуется в вызов init для класса, а «WithFormat» превращается в именованный первый аргумент «format:». Оригинальный вопрос не добавил какого-либо определенного форматирования, например, изменение количества десятичных чисел с плавающей запятой для отображения, если бы он имел, ваш был бы единственным ответом!
Дэвид Х

4
Вы бы ссылку на документацию? У меня проблемы с поиском.
Дамблдад

3
Этот метод исходит из NSStringв Foundationрамках . Таким образом, вы должны import Foundationзаставить это работать правильно. В противном случае выражение будет вызываться String.init<T>(T), и оно будет производить что-то вроде "(\"%@%x %x\", 10)"вместо.
Эонил

1
@realityone, что %@%xозначают символы? Можете ли вы указать мне на ресурс, где я могу узнать больше об этом.
bibscy



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

Обновление: я написал этот ответ до того, как Swift String(format:)добавил его API. Используйте метод, указанный в верхнем ответе .


6
Я не думаю, что это на самом деле отвечает на вопрос, потому что нет форматирования. Используя этот метод, вы не можете отформатировать, сколько десятичных знаков должно быть в ваших плавающих точках. Использование String(format:arguments:)было бы более целесообразным, чтобы добавить форматирование
Крис

4
Оператор не запрашивал никакого форматирования, это был просто способ создать строку с форматом, который может преобразовывать типы int, long, double и т. Д. В строку .
Джон Эстропия

Вопрос неясен тогда. Потому что он сравнивает то, что он хочет, с -stringWithFormat:которым позволяет форматирование. В Swift String(format:arguments:)будет Swift версия Obj-C-stringWithFormat:
Крис

Проверьте дату вопроса. Это было во время первого выпуска Swift, когда NSStringметоды еще не были реализованы в Swift String.
Джон Эстропия

Я стою исправлено. Все еще хорошо иметь новый способ, видимый для любого, ищущего ту же самую проблему в будущем
Крис


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

Сначала прочтите Официальную документацию по языку 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
нет необходимости использовать модификаторы. Мы также можем использовать его без модификаторов. Это верно, но длинный код.
Гаурав Гилани

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

Существует простое решение, которое я узнал с помощью «We <3 Swift», если вы не можете импортировать Foundation , использовать round () и / или не хотите String :

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

-2

Успех попробовать это:

 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))
        }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.