Swift:格式化字符串宽度

Swift:格式化字符串宽度,swift,string,format,Swift,String,Format,我想用C/C++、Java和其他许多语言做的事情非常简单。我只想指定字符串的宽度,类似于: printf("%-15s", var); 这将创建一个15个字符的字段宽度。我做了很多谷歌搜索。我尝试过用各种方式使用COpaquepointer和String(格式:),但运气不佳。如果有任何建议,我将不胜感激。我在谷歌搜索时可能会错过一些东西。你尝试过这个吗 let string1 = "string1" let string2 = "string2" let formattedString =

我想用C/C++、Java和其他许多语言做的事情非常简单。我只想指定字符串的宽度,类似于:

printf("%-15s", var);
这将创建一个15个字符的字段宽度。我做了很多谷歌搜索。我尝试过用各种方式使用
COpaquepointer
String(格式:
),但运气不佳。如果有任何建议,我将不胜感激。我在谷歌搜索时可能会错过一些东西。

你尝试过这个吗

let string1 = "string1"
let string2 = "string2"
let formattedString = String(format: "%-15s - %s",
             COpaquePointer(string1.cStringUsingEncoding(NSUTF8StringEncoding)!),
             COpaquePointer(string2.cStringUsingEncoding(NSUTF8StringEncoding)!)
)

print(formattedString)
//string1         - string2
你试过这个吗

let string1 = "string1"
let string2 = "string2"
let formattedString = String(format: "%-15s - %s",
             COpaquePointer(string1.cStringUsingEncoding(NSUTF8StringEncoding)!),
             COpaquePointer(string2.cStringUsingEncoding(NSUTF8StringEncoding)!)
)

print(formattedString)
//string1         - string2

问题是Swift字符串具有可变大小的元素,因此“15个字符”是不明确的。这是简单字符串的一个挫折来源-但在处理表情符号、区域标识符、连字等时,使语言更加精确

您可以将Swift字符串转换为C字符串,并使用普通格式设置程序(请参见Santosh的回答)。处理字符串的“Swift”方法是从
字符集的起始索引开始,并前进N次。例如:

let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

let index = alphabet.characters.startIndex.advancedBy(14) // String.CharacterView.Index
let allChars = alphabet.characters.prefixThrough(index) // String.CharacterView

print(String(allChars)) // "ABCDEFGHIJKLMNO\n"
如果要强制填充,可以使用以下方法:

extension String {
    func formatted(characterCount characterCount:Int) -> String {
        if characterCount < characters.count {
            return String(characters.prefixThrough(characters.startIndex.advancedBy(characterCount - 1)))
        } else {
            return self + String(count: characterCount - characters.count, repeatedValue: " " as Character)
        }
    }
}

let abc = "ABC"
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

print("!\(abc.formatted(characterCount: 15))!")
// "!ABC            !\n"

print("!\(alphabet.formatted(characterCount: 15))!")
// "!ABCDEFGHIJKLMNOP!\n"
扩展字符串{
func格式(characterCount characterCount:Int)->字符串{
如果characterCount
问题在于,Swift字符串具有可变大小的元素,因此“15个字符”是不明确的。这是简单字符串的一个挫折来源-但在处理表情符号、区域标识符、连字等时,使语言更精确

您可以将Swift字符串转换为C字符串,并使用普通格式设置程序(请参见Santosh的回答)。处理字符串的“Swift”方法是从
字符集的起始索引开始,并前进N次。例如:

let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

let index = alphabet.characters.startIndex.advancedBy(14) // String.CharacterView.Index
let allChars = alphabet.characters.prefixThrough(index) // String.CharacterView

print(String(allChars)) // "ABCDEFGHIJKLMNO\n"
如果要强制填充,可以使用以下方法:

extension String {
    func formatted(characterCount characterCount:Int) -> String {
        if characterCount < characters.count {
            return String(characters.prefixThrough(characters.startIndex.advancedBy(characterCount - 1)))
        } else {
            return self + String(count: characterCount - characters.count, repeatedValue: " " as Character)
        }
    }
}

let abc = "ABC"
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

print("!\(abc.formatted(characterCount: 15))!")
// "!ABC            !\n"

print("!\(alphabet.formatted(characterCount: 15))!")
// "!ABCDEFGHIJKLMNOP!\n"
扩展字符串{
func格式(characterCount characterCount:Int)->字符串{
如果characterCount
你最好自己做

let str0 = "alpha"
let length = 20
// right justify
var str20r = String(count: (length - str0.characters.count), repeatedValue: Character(" "))
str20r.appendContentsOf(str0)
// "               alpha"

// left justify
var str20l = str0
str20l.appendContentsOf(String(count: (length - str0.characters.count), repeatedValue: Character(" ")))
// "alpha               "
如果你需要一些“更一般的”

func formatString(str: String, fixLenght: Int, spacer: Character = Character(" "), justifyToTheRigth: Bool = false)->String {
    let c = str.characters.count
    let start = str.characters.startIndex
    let end = str.characters.endIndex
    var str = str
    if c > fixLenght {
        switch justifyToTheRigth {
        case true:
            let range = start.advancedBy(c - fixLenght)..<end
            return String(str.characters[range])
        case false:
            let range = start..<end.advancedBy(fixLenght - c)
            return String(str.characters[range])
        }
    } else {
        var extraSpace = String(count: fixLenght - c, repeatedValue: spacer)
        if justifyToTheRigth {
            extraSpace.appendContentsOf(str)
            return extraSpace
        } else {
            str.appendContentsOf(extraSpace)
            return str
        }
    }
}

let str = "ABCDEFGH"
let s0 = formatString(str, fixLenght: 3)
let s1 = formatString(str, fixLenght: 3, justifyToTheRigth: true)
let s2 = formatString(str, fixLenght: 10, spacer: Character("-"))
let s3 = formatString(str, fixLenght: 10, spacer: Character("-"), justifyToTheRigth: true)

print(s0)
print(s1)
print(s2)
print(s3)

你最好自己做

let str0 = "alpha"
let length = 20
// right justify
var str20r = String(count: (length - str0.characters.count), repeatedValue: Character(" "))
str20r.appendContentsOf(str0)
// "               alpha"

// left justify
var str20l = str0
str20l.appendContentsOf(String(count: (length - str0.characters.count), repeatedValue: Character(" ")))
// "alpha               "
如果你需要一些“更一般的”

func formatString(str: String, fixLenght: Int, spacer: Character = Character(" "), justifyToTheRigth: Bool = false)->String {
    let c = str.characters.count
    let start = str.characters.startIndex
    let end = str.characters.endIndex
    var str = str
    if c > fixLenght {
        switch justifyToTheRigth {
        case true:
            let range = start.advancedBy(c - fixLenght)..<end
            return String(str.characters[range])
        case false:
            let range = start..<end.advancedBy(fixLenght - c)
            return String(str.characters[range])
        }
    } else {
        var extraSpace = String(count: fixLenght - c, repeatedValue: spacer)
        if justifyToTheRigth {
            extraSpace.appendContentsOf(str)
            return extraSpace
        } else {
            str.appendContentsOf(extraSpace)
            return str
        }
    }
}

let str = "ABCDEFGH"
let s0 = formatString(str, fixLenght: 3)
let s1 = formatString(str, fixLenght: 3, justifyToTheRigth: true)
let s2 = formatString(str, fixLenght: 10, spacer: Character("-"))
let s3 = formatString(str, fixLenght: 10, spacer: Character("-"), justifyToTheRigth: true)

print(s0)
print(s1)
print(s2)
print(s3)

您可以使用
with cstring
将字符串快速转换为字节数组(技术上是
非安全指针
):


您可以使用
with cstring
将字符串快速转换为字节数组(技术上是
非安全指针
):


从一方面来说,%@用于格式化字符串对象:

import Foundation

var str = "Hello"
print(String(format: "%@", str))
但它不支持“宽度”修改器:

print(String(format: "%-15@", str))
仍将打印未添加的文本:

"Hello\n"
但是,有一个修饰符%s似乎适用于CString:

var cstr = (str as NSString).utf8String //iOS10+ or .UTF8String otherwise

print(String(format: "%-15s", cstr!))
输出:

"Hello          \n"
一件好事是,您可以使用与NSLog相同的格式规范:

NSLog("%-15s", cstr!)

从一方面来说,%@用于格式化字符串对象:

import Foundation

var str = "Hello"
print(String(format: "%@", str))
但它不支持“宽度”修改器:

print(String(format: "%-15@", str))
仍将打印未添加的文本:

"Hello\n"
但是,有一个修饰符%s似乎适用于CString:

var cstr = (str as NSString).utf8String //iOS10+ or .UTF8String otherwise

print(String(format: "%-15s", cstr!))
输出:

"Hello          \n"
一件好事是,您可以使用与NSLog相同的格式规范:

NSLog("%-15s", cstr!)

我们现在有很多有趣的答案。谢谢大家。我写了以下内容:

func formatLeftJustifiedWidthSpecifier(stringToChange: String, width: Int) -> String {

    var newString: String = stringToChange
    newString = newString.stringByPaddingToLength(width, withString: " ", startingAtIndex: 0)
    return newString
}

我们现在有很多有趣的答案。谢谢大家。我写了以下内容:

func formatLeftJustifiedWidthSpecifier(stringToChange: String, width: Int) -> String {

    var newString: String = stringToChange
    newString = newString.stringByPaddingToLength(width, withString: " ", startingAtIndex: 0)
    return newString
}

是的。我相信我收到了一个exc_bad_指令错误。现在我正在编写一个自定义函数,以便在找到更好的答案之前为我执行我想要的操作。是的。我相信我收到了一个exc_bad_指令错误。现在我正在编写一个自定义函数,以便在找到更好的答案之前为我执行我想要的操作。如果它是sho,会填充一个字符串吗r超过15个字符?@AlexCau那么不,它会崩溃,因为你会超过字符串中的字符数。这只是一个简单的例子,说明如何在Swift中处理字符串长度。@AlexCau然后我用一个字符串扩展名更新了我的答案,如果字符串长度小于15个字符,它可能会做你想做的事情@AlexCau那么不,它会崩溃,因为你会超过字符串中的字符数。这只是一个在Swift中处理字符串长度的简单示例。@AlexCau然后我用一个字符串扩展名更新了我的答案,该扩展名可能会做你想做的事情,你会得到“(“%-15s”,0x00007fcf287884b0)”:-)不是这样,根据我现在不在Xcode附近,所以我不能测试,我将等待另一个确认。如果你导入基础不工作,我会删除它,它应该工作,正如你预想的。你得到“(%-15s),0x09007FCF25784B0):-不是这样的,因为我现在不在XCODE附近,所以我不能等待另一个确认。我会删除它,如果它不工作,如果你导入基础,它应该工作,正如你所期望的。几个问题:(1)你架桥到NString,所以你失去了SWIFT字符串的好处,(2)为什么甚至写这个,而不是直接调用<代码> String ByPopPoDeloToString ?,(3)<代码>:String 是不必要的,(4)为什么分配给
newString
只是为了立即覆盖该值?我不知道它与