2016-12-14 39 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