2016-12-14 15 views
3

是可能的,用fmt.Println("...")打印一个字符串与中心alignement的壳?如何fmt.Print(“打印在中心”)

+1

那么你知道shell的宽度还是你需要解决的问题的一部分? – miltonb

+0

这可以告诉你的宽度和高度:http://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window – miltonb

+0

@miltonb,你的链接是对于bash,...我可以使用bash吗? – sensorario

回答

2

只要壳宽是已知值,此代码就会管理文本居中。它不是'像素完美',但我希望它有帮助。

如果我们将其分解,有两位代码可以生成格式字符串,然后填充右边然后左边。

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

+0

我见过。但是,你能解释一下“%% - %ds”吗? Doc说'%% \t字面百分号;不消耗任何价值“究竟意味着什么? '%d是数字'。 – sensorario

+0

已更新,更好地描述了生成格式字符串的代码。 – miltonb

+0

我认为解决方案代码中存在一个错误,因为它没有考虑字符串's'的宽度。请访问https://play.golang.org/p/8L5IfEIKSS查看修改后的游乐场代码。我想你需要用'w'替换第一个'w/2',第二个用'(w + len(s))/ 2'来替换,如下面的答案所示。 – PaSTE

1

作为更新这一长期问题的回答,发表@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

+0

关于[n]符号的优秀补充使其更简单 - 总是更好。 – miltonb