2016-12-14 1 views
3

fmt.Println("...")で、シェルの中心整列で文字列を印刷できますか?fmt.Printの方法( "中央に印刷する")

+1

シェルの幅を知っていますか、それともどのように動作させる必要があるのでしょうか? – 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

このコードは、シェルの幅が既知の値である限り、テキストの中央を管理します。それはかなり完璧ではありませんが、私はそれが助けてくれることを願っています。

これを分解すると、右と左に書式設定文字列を生成する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/2'を' w'に、2番目を '(w + len(s))/ 2'に置き換える必要があると思います。 – PaSTE

1

、@miltonbによって掲示ソリューションはfmtパッケージから*表記を使用することによって大幅に改善することができます。 the package documentationから:

のprintf、sprintfの、とfprintfのは、デフォルトの動作では、呼び出しで渡された連続した引数をフォーマットするために、各 フォーマットする動詞です。 しかし、動詞の直前の表記[n]は、 がn番目の1つの索引付き引数が代わりにフォーマットされることを示します。 同じ より前の表記は、幅または精度が '*'の場合、値を保持する引数 を選択します。括弧で囲まれた式[n]を処理した後で、 後続の動詞は、別の場合を除き、引数n + 1、n + 2などを使用します。

だから、同じ結果を達成するために、より簡潔な形式の文でfmt.Sprintf通話のうち2つを置き換えることができます。

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

関連する問題