与this Java question类似,但对于Swift。
如何将这样的表输出到控制台,理想情况下使用println
?
n result1 result2 time1 time2
-----------------------------------------------------
5 1000.00 20000.0 1000ms 1250ms
5 1000.00 20000.0 1000ms 1250ms
5 1000.00 20000.0 1000ms 1250ms
我尝试使用println("n\tresult1\tresult2")
,但结果没有正确排列。
答案 0 :(得分:5)
我找到了一种使用String方法" padding(:)"在Swift(3.0)中生成列式文本输出的快捷方法。 [在Swift 2.x中,该方法命名为" stringByPaddingToLength(:)"]。它允许您指定列的宽度,要用作填充的文本以及要开始的填充的索引。如果你不介意它只适用于左对齐的文本列,那就像魅力一样。如果你想要其他对齐,你必须购买其他字符计数方法和其他复杂性。
下面的解决方案旨在说明方法" padding(::)"的实用性。显然,利用这一点的最佳方法是创建一个迭代通过集合来生成所需表的函数,同时最小化代码重复。我这样做是为了专注于手头的任务。
最后," println"在Swift 2.x +中似乎不存在,所以我恢复了" print()"。
使用您陈述的问题说明一个例子:
//Set up the data
let n : Int = 5
let result1 = 1000.0
let result2 = 20000.0
let time1 = "1000ms"
let time2 = "1250ms"
//Establish column widths
let column1PadLength = 8
let columnDefaultPadLength = 12
//Define the header string
let headerString = "n".padding(toLength: column1PadLength, withPad: " ", startingAt: 0) + "result1".padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0) + "result2".padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0) + "time1".padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0) + "time2".padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0)
//Define the line separator
let lineString = "".padding(toLength: headerString.characters.count, withPad: "-", startingAt: 0)
//Define the string to display a line of our data
let nString = String(n)
let result1String = String(result1)
let result2String = String(result2)
let dataString = nString.padding(toLength: column1PadLength, withPad: " ", startingAt: 0) + result1String.padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0) + result2String.padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0) + time1.padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0) + time2.padding(toLength: columnDefaultPadLength, withPad: " ", startingAt: 0)
//Print out the data table
print("\(headerString)\n\(lineString)\n\(dataString)")
输出将以整齐的柱状格式打印到您的控制台:
n result1 result2 time1 time2
--------------------------------------------------------
5 1000.0 20000.0 1000ms 1250ms
更改变量" columnDefaultPadLength"从12到8将产生以下输出:
n result1 result2 time1 time2
----------------------------------------
5 1000.0 20000.0 1000ms 1250ms
最后,将填充长度减少到小于数据的值会截断数据而不是生成错误,非常方便!更改" columnDefaultPadLength"从8到4导致此输出:
n resuresutimetime
------------------------
5 1000200010001250
显然不是理想的格式,但通过简单调整填充长度,您可以快速将表格调整为紧凑且可读的形式。
答案 1 :(得分:0)
您需要确定数据中字符串的最大长度(来自键和值),然后填充这些字符串。您可以使用我在下面提供的功能来计算最大长度并从那里开始。
func maxLength(data: Dictionary<String,Double>) -> Int {
var greatestLength = 0
for (key, value) in data {
var valueLength = countElements(String(format: "%.2f", value))
var keyLength = countElements(key)
var length = max(valueLength, keyLength)
if (length > greatestLength) {
greatestLength = length
}
}
return greatestLength
}