Як створити рядок з форматом?


187

Мені потрібно створити рядок з форматом, який може перетворювати типи int, long, double тощо в рядок. Використовуючи Obj-C, я можу це зробити нижче.

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

Як зробити те ж саме зі швидким?

Відповіді:


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)"замість.
eonil

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



49
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.
Іван Естропія

Я стою виправлений. Але все ж добре мати новий вигляд для кожного, хто шукає ту саму проблему в майбутньому
Кріс

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
немає необхідності використовувати модифікатори. Ми також можемо використовувати його без модифікаторів. Це правильно, але довгий код.
Гаурав Гілані

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

Існує просте рішення, яке я дізнався з "Ми <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.