生成具有等宽列的表(在控制台上以Xcode查看)

生成具有等宽列的表(在控制台上以Xcode查看),xcode,swift,Xcode,Swift,这是我用来检查计算的一段代码,我只是将这些值写入Xcode中的控制台。每个数组都声明了如下所示的值 var water_deficit: [Int] = [] 该程序计算缺水值,并将其添加到此列表中(未显示计算结果) 控制台上显示的输出: Month Rainfall Raindays Water Deficit January 38 3 38 Feburary 94 6 -18 March 142 8 -8 A

这是我用来检查计算的一段代码,我只是将这些值写入Xcode中的控制台。每个数组都声明了如下所示的值

var water_deficit: [Int] = []
该程序计算缺水值,并将其添加到此列表中(未显示计算结果)

控制台上显示的输出:

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

如您所见,因为单词/数字的长度不同,所以列是偏移的。我需要如何生成特定宽度的列以避免此问题?

出现这种情况是因为字符串长度和变量长度不匹配,\t这导致tab in line tab与字符串长度不匹配

因此,有两种方法可以阻止这种情况:

  • 最简单的方法->只需将所有月份的名称设置为相同的长度,这将很容易消除不匹配

    月份:[字符串]=[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”]

  • 将变量设置为如下格式:

    设nf=NSNumberFormatter() nf.numberStyle=NSNumberFormatterStyle.DecimalStyle


  • 诀窍是根据您希望字符串右对齐还是左对齐,计算字符串单位左侧或右侧的右填充。下面是一个快速实现。(Swift 2.0,Xcode 7 beta3)

    let headers=[“月份”、“降雨量”、“雨天”、“缺水”]
    月份=[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”]
    让降雨量=[38,94,142149236305202,82,139,222,178,103]
    让雨天=[3,6,8,7,12,16,10,8,12,14,11,7]
    假设水赤字=[38,-18,-8,-1116301202,82101203208,103]
    func GetRightRightedStringRepfor(数字:Int,参考字符串:String)->String
    {
    让长度=refString.utf8.count
    设stringRep=字符串(编号)
    var paddedStringRep:String=“”
    //建立必要的填充
    对于变量i=0;i<(长度-stringRep.utf8.count);i++
    {
    paddedStringRep+=“”
    }
    paddedStringRep+=stringRep
    返回填充StringRep
    }
    让headingsToDisplay=标题。减少(“”){
    (var累计:字符串,项目:字符串)->字符串输入
    返回累计+项目+“\t\t\t”
    }
    打印(标题显示)
    //通过向前填充获得适当的对齐月份,因为我们希望它们保持左对齐
    让LeftRightedMonths=months.map{
    (变量项:字符串)->输入字符串
    让paddingseeded=9-item.utf8.count//9是长月份名称的长度
    对于变量i=0;i
    这将产生:

    试试这个:

    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]))
    }
    
    有关联合国格式和格式说明符的详细信息,请参阅和

    let month=(months[i]作为NSString)。UTF8String
    中,我正在应用a:在C字符串的格式说明符中指定长度非常容易,但我不知道如何为字符串指定长度(我猜这是不可能的)


    }

    试试这个:@Apple and Oranges,感谢您将这个问题链接起来,它为我提供了一种查找数据最大长度的方法,不过上面写着“然后填充这些字符串”。我是编程新手,我不知道这意味着什么,也不知道怎么做。你知道怎么做吗?你能出示降雨量、雨日等的申报单吗。?它们是整数数组还是字符串数组?@MarioZannone,我已经编辑了这个问题,将声明完全包括在程序中。我相信months是String类型的,其余的数组是Int类型的。希望这有助于我知道这就是问题所在,我只是不知道如何解决它!改变月份的名称是可能的,但我觉得这并不能解决问题,只是掩盖了问题。此外,我想知道在表中打印的值发生变化(取决于用户输入)的情况下如何执行此操作,例如,在一种情况下,数字可能为101(3个字符)。如果用户在程序请求中输入不同的值,相同的数字可能会读取1000(4个字符),因此同样的问题也会发生。必须有一种方法来创建给定宽度的列。对于0…11i中的i{print(months[i])countElements(months[i])>4?print(“\t\t”):print(“\t\t”)print(raindays[i])countElements(String(raindays[i])>4?print(“\t\t\t\t”)print(“\t”)raindays[i])countElements(String(raindays[i])>4?print(“\t\t”):print(“\t\t\t”)print(\t\t”)print(water_defect[i])print(\n”)}只需复制粘贴此代码@JackHayton…它将在所有可能的情况下对您有所帮助:)我复制了代码,但它不起作用,最初程序希望我添加一个semisolon(;)在连续的命令之间,即使这样做了也不起作用。我更希望你知道一种方法,而不是在任何情况下我都能理解和应用的解决方案。我正在上传另一个答案以便更好地查看:)谢谢你的这篇文章,我试图将其复制并粘贴到一个新的游乐场,但代码中有几个错误。第一个错误在命令“variablename.utf8.count”中显示错误:String.UTF8View没有名为count的成员(发生两次)。第二个错误是for循环中的第一个print语句。错误是:“找不到接受的“print”重载…”
      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")
    
    }
    
    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 i in 0...11 {
    print(months[i])
    countElements(months[i]) > 4 ? print("\t\t") : print("\t\t\t")
    
    print(rainfall[i])
    countElements(String(rainfall[i])) > 4 ? print("\t\t") : print("\t\t\t")
    
    print(raindays[i])
    countElements(String(raindays[i])) > 4 ? print("\t\t") : print("\t\t\t")
    
    print(water_deficit[i])
    print("\n")