This is a piece of code that I am using to check my calculations, I am simply writing out these values into the console in Xcode. Each of the arrays is declared with the values that are shown below.
var water_deficit: [Int] = []
The program calculates values for water deficit and appends them into this list (the calculations are not shown)
let months = ["January","Feburary","March","April","May","June","July","August","September","October","November","December"]
let rainfall = [38,94,142,149,236,305,202,82,139,222,178,103]
let raindays = [3,6,8,7,12,16,10,8,12,14,11,7]
for i in 0...11 {
    println("\(months[i]) \t \(rainfall[i]) \t \(raindays[i]) \t \(water_deficit[i])")
}
The output as shown on the console:
Month    Rainfall    Raindays    Water Deficit
January      38      3   38
Feburary     94      6   -18
March    142     8   -8
April    149     7   -1
May      236     12      116
June     305     16      301
July     202     10      202
August   82      8   82
September    139     12      101
October      222     14      203
November     178     11      208
December     103     7   103
As you can see, because the length of the words/numbers are different, the columns are offset. What do I need to do to generate columns of a specific width to avoid this problem?
Try this:
for i in 0...11 {
  let month = (months[i] as NSString).UTF8String
  println(String(format:"%-10s %10d %10d %10d",  month, 
                 rainfall[i], raindays[i], water_deficit[i]))
}
For details un format and format specifiers see here and here.
In let month = (months[i] as NSString).UTF8String I am applying a conversion from String to C String: it is pretty easy to specify a length in the format specifier of a C String, but I don't know how to do it for a String (my guess is that it is not possible).
The trick is to compute right paddings to the left or to the right of a string unit depending on if you want the string to be right or left justified. Here is a quick implementation. (Swift 2.0, Xcode 7 beta3).
  let headings = ["Month    ", "Rainfall", "RainDays", "Water Deficit"]
let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
let rainFalls = [38, 94, 142,149,236,305,202, 82, 139, 222, 178, 103]
let rainyDays = [3, 6, 8,7,12,16,10, 8, 12, 14, 11, 7]
let waterDeficits = [38, -18, -8,-1,116,301,202, 82, 101, 203, 208, 103]
func getRightJustifiedStringRepFor(number: Int, refString:String) -> String
{
    let length = refString.utf8.count
    let stringRep = String(number)
    var paddedStringRep : String = ""
    //Build necessary padding
    for  var i = 0 ; i <  (length - stringRep.utf8.count) ; i++
    {
        paddedStringRep += " "
    }
    paddedStringRep += stringRep
    return paddedStringRep
}
let headingsToDisplay = headings.reduce(""){
    (var accummulated : String, item: String) -> String in
    return accummulated  + item +  "\t\t\t"
}
print(headingsToDisplay)
//Get proper aligned months with forward padding as we want them left aligned
let leftJustifiedMonths = months.map{
    (var item: String) -> String in
    let paddingsNeeded = 9 - item.utf8.count  //9 is the  length of lengthy month name
    for var i = 0 ; i < paddingsNeeded ; i++
    {
        item += " "
    }
    return item
}
print("\n")
for i in 0...11
{
    print(leftJustifiedMonths[i], appendNewline:false)
    print("\t\t\t", appendNewline:false)
    print( (getRightJustifiedStringRepFor(rainFalls[i], refString: "Rainfall")), appendNewline:false)
    print("\t\t\t", appendNewline:false)
    print( (getRightJustifiedStringRepFor(rainyDays[i], refString: "RainDays")),appendNewline:false)
    print("\t\t\t", appendNewline:false)
    print( (getRightJustifiedStringRepFor(waterDeficits[i], refString: "Water Deficit")),appendNewline:false)
    print("\n")
}
This outputs:

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With