Golang:印刷時に数値をゼロで埋める方法は?


99

数値を印刷したり、ゼロのパディングで文字列を作成して固定幅にするにはどうすればよいですか?

たとえば、番号が12あり、それを作りたい場合など000012です。

回答:


176

fmtパッケージはこれを行うことができます:

fmt.Printf("|%06d|%6d|\n", 12, 345)

%06dの0に注目してください。これにより、幅が6になり、ゼロが埋め込まれます。2つ目はスペースで埋められます。

あなたはここでそれを実際に見ることができます:http : //play.golang.org/p/cinDspMccp


2
パッドを右にしたい場合はどうなりますか?フラグを使用すると、-スペースしか得られません。ゼロが必要です。
majidarif 2017

5
あなたと後で仕事に文字列をしたい場合は、使用Sprintfの代わりにPrintf
oliverpool

42

使用Printfから機能をFMTパッケージwidth6パディング文字0

import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'

width書式指定子( '動詞')の直前に整数を置くことで動作を設定します。

fmt.Printf("%d", 12)   // Uses default width,                          prints '12'
fmt.Printf("%6d", 12)  // Uses a width of 6 and left pads with spaces, prints '    12'

Golang(および他のほとんどの言語)でサポートされているパディング文字はスペースと0

fmt.Printf("%6d", 12)   // Default padding is spaces, prints '    12'
fmt.Printf("%06d", 12)  // Change to 0 padding,       prints '000012'

マイナスを付加することにより、印刷を右揃えにすることができます-

fmt.Printf("%-6d", 12)   // Padding right-justified, prints '12    '

浮動小数点数の場合、幅にはフォーマット文字列全体が含まれることに注意してください。

fmt.Printf("%6.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)

幅を*数値の代わりに使用し、幅をintパラメーターとして渡すことにより、プログラムで設定することもできます。

myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before

これは、たとえば、印刷したい最大値が実行時にしか分からない場合に役立ちます(maxVal次の例で呼び出されます)。

myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)

最後に、出力したくないstdoutが文字列を返す場合は、同じパラメータを使用Sprintfしてfmtパッケージからも使用します。

s := fmt.Sprintf("%06d", 12) // returns '000012' as a String

29

これを実現する最も簡単な方法が1つあります。使用する

func padNumberWithZero(value uint32) string {
    return fmt.Sprintf("%02d", value)
}

fmt.Sprintf文字列をどこにも出力せずにフォーマットして返します。ここで%02dは、桁数が2未満の値の左側にゼロを埋め込んでいます。与えられた値が2桁以上の場合、パディングされません。例えば:

  • 入力が1の場合、出力は01になります。
  • 入力が12の場合、出力は12になります。
  • 入力が1992の場合、出力は1992になります。

%03dより多くのゼロのパディングには、以上を使用できます。


10

Go langの印刷形式のリスト」という質問は、フラグもあることを思い出させます。

- 左側ではなく右側にスペースを埋め込む(フィールドを左揃えにする)


DaddyOh/golang-samples/pad.go他の文字列シーケンス( ' 0'または ' ' より複雑)でパディングしたい場合は、でより多くのパディングの例を見ることができます。

  • leftPad(s string, padStr string, pLen int)
  • rightPad(s string, padStr string, pLen int)
  • leftPad2Len(s string, padStr string, overallLen int)
  • rightPad2Len(s string, padStr string, overallLen int)

を参照してくださいplay.golang.org

1234567890

leftPad(str, "*", 3)  ***1234567890
leftPad2Len(str, "*-", 13)  -*-1234567890
leftPad2Len(str, "*-", 14)  *-*-1234567890
leftPad2Len(str, "*", 14)  ****1234567890
leftPad2Len(str, "*-x", 14)  x*-x1234567890
leftPad2Len(str, "ABCDE", 14)  BCDE1234567890
leftPad2Len(str, "ABCDE", 4)  7890
rightPad(str, "*", 3)  1234567890***
rightPad(str, "*!", 3)  1234567890*!*!*!
rightPad2Len(str, "*-", 13)  1234567890*-*
rightPad2Len(str, "*-", 14)  1234567890*-*-
rightPad2Len(str, "*", 14)  1234567890****
rightPad2Len(str, "*-x", 14)  1234567890*-x*
rightPad2Len(str, "ABCDE", 14)  1234567890ABCD
rightPad2Len(str, "ABCDE", 4)  1234

Eric Palmerは、golangサンプルで彼のリポジトリを削除したため、リンクは機能しなくなりました。
コンスタンティンアジゾフ2017年

1
@KonstantinAzizov良い点。そのリンクを復元しました。ちょっと。
VonC 2017年

3
func lpad(s string,pad string, plength int)string{
    for i:=len(s);i<plength;i++{
        s=pad+s
    }
    return s
}

lpad( "3"、 "0"、2)結果: "03"

lpad( "12"、 "0"、6)結果: "000012"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.