【问题标题】:How to format multiple Strings so that they are flush with each other如何格式化多个字符串以使它们彼此齐平
【发布时间】:2019-05-31 10:57:32
【问题描述】:

说明

我想格式化多个字符串,使它们彼此齐平。 (查看实际结果和预期结果)

我尝试了什么

我已经实现了这个解决方案:https://stackoverflow.com/a/31613297/11582550 (见代码) 它也有效,但前提是我在控制台中打印结果。我想将文本保存在 label.text 中,这是行不通的。

一些代码

func formattedString(left:String, right:String) -> String {
        let left = (left as NSString).utf8String
        let right = (right as NSString).utf8String
        print(String(format:"%-20s %-20s", left!, right!))
        return String(format:"%-20s %-20s", left!, right!)
    }

label.text += formattedString(left: "Firstname: ", right: "Alfred") + "\n" + formattedString(left:"Lastname: ", right: "LongLastname") + "\n" + formattedString(left:"Note:", right: "private")

// actual result

我的预期

## actual result (saved in label.text)
Firstname:    Alfred
Lastname:    LongLastname
Note:    private

## expected result (saved in label.text)
Firstname:    Alfred
Lastname:     LongLastname
Note:         private

【问题讨论】:

  • 不清楚,预期结果和实际结果似乎是一样的。
  • 所以你的问题是列不对齐,因为字体是比例字体,不同的字符可以有不同的宽度?
  • @vacawama:感谢您的编辑——这正是我的意思。
  • 我认为@MartinR 在他的第一条评论中发现了您的问题。为您的标签选择一个固定的空格字体(例如 Courier New),这应该可以解决您的问题。
  • @Martin R 和 vacawama:实际上,这解决了我的问题。谢谢!我会将问题标记为已回答。

标签: swift nsstring


【解决方案1】:

您的问题是您的标签使用的是比例字体而不是固定宽度字体。在比例字体中,字符宽度会有所不同,因此您不能期望字符对齐。

将您的标签使用的字体更改为固定宽度的字体(例如 CourierCourier NewMenlo)并且这将解决您的问题。

【讨论】:

    【解决方案2】:

    我建议使用纯 Swift 字符串操作,而不是在 Swift 中使用低级 C 函数和 C 字符串(指针):

    func formattedString(left: String, right: String, width: Int = 20) -> String {
        // The `max` call returns 0 if `width - left.count` is negative
        let filler = String(repeating: " ", count: max(0, width - left.count))
        return left + filler + right
    }
    
    let result = formattedString(left: "Firstname: ", right: "Alfred") + "\n" + formattedString(left:"Lastname: ", right: "LongLastname") + "\n" + formattedString(left:"Note:", right: "private")
    print(result)
    
    // Firstname:          Alfred
    // Lastname:           LongLastname
    // Note:               private
    

    要切断长字符串,你可以这样做:

    func limit(string: String, length: Int) -> String {
        if string.count <= length {
            return string
        }
        return string.prefix(length) + "…"
    }
    

    【讨论】:

    • 这解决了我的问题,但会引发下一个问题,即较长的输入会导致换行。
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2021-11-07
    • 2019-08-21
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多