如何fmt.Print(“在中心打印”)

时间:2016-12-14 00:45:54

标签: go

是否可以使用fmt.Println("...")打印带有贝壳中心对齐的字符串?

2 个答案:

答案 0 :(得分:4)

作为对这个久负盛名的问题的更新,@ miltonb发布的解决方案可以通过使用*包中的fmt表示法进行改进。来自the package documentation

  

在Printf,Sprintf和Fprintf中,默认行为是每个   格式化动词以格式化在调用中传递的连续参数。   但是,动词前面的符号[n]表示   第n个单索引参数将被格式化。 同样的   宽度或精度的'*'之前的符号选择参数   保持该值的索引。处理括号内的表达式[n]后,   除非另有说明,否则后续动词将使用参数n + 1,n + 2等   定向。

因此,您可以使用更简洁的格式语句替换两个fmt.Sprintf调用,以实现相同的结果:

s := "in the middle"
w := 110 // or whatever

fmt.Sprintf("%[1]*s", -w, fmt.Sprintf("%[1]*s", (w + len(s))/2, s))

See the code in action

答案 1 :(得分:3)

只要shell宽度是已知值,此代码就会将文本居中。它不是“像素完美”,但我希望它有所帮助。

如果我们将其分解,则有两位代码可以生成格式字符串,以便向右然后向左移动。

fmt.Sprintf("%%-%ds", w/2)  // produces "%-55s"  which is pad left string
fmt.Sprintf("%%%ds", w/2)   // produces "%55s"   which is right pad

所以最终的Printf语句变为

fmt.Printf("%-55s", fmt.Sprintf("%55s", "my string to centre")) 

完整代码:

s := " in the middle"
w := 110 // shell width

fmt.Printf(fmt.Sprintf("%%-%ds", w/2), fmt.Sprintf(fmt.Sprintf("%%%ds", w/2),s))

产生以下内容:

                                     in the middle

链接到游戏场:play