Golang: Bagaimana cara mengisi angka dengan nol saat mencetak?

103

Bagaimana cara mencetak angka atau membuat string dengan bantalan nol agar lebarnya tetap?

Misalnya, jika saya punya nomor 12dan saya ingin membuatnya 000012.

Travis Reeder
sumber

Jawaban:

178

Paket fmt dapat melakukan ini untuk Anda:

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

Perhatikan 0 dalam% 06d, yang akan membuatnya menjadi lebar 6 dan mengisinya dengan nol. Yang kedua akan diisi dengan spasi.

Anda dapat melihatnya beraksi di sini: http://play.golang.org/p/cinDspMccp

Travis Reeder
sumber
2
Bagaimana jika saya ingin padnya ada di kanan? menggunakan bendera -hanya memberi spasi, saya butuh nol.
majidarif
5
Jika Anda ingin string untuk dikerjakan nanti, gunakan Sprintfsebagai penggantiPrintf
oliverpool
43

Gunakan Printffungsi dari paket fmt dengan a widthof 6dan karakter padding 0:

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

Mengatur widthkarya dengan meletakkan integer tepat sebelum penentu format ('verb'):

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'

Karakter pengisi yang didukung oleh Golang (dan sebagian besar bahasa lainnya) adalah spasi dan 0:

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

Anda dapat membenarkan pencetakan dengan menambahkan tanda minus -:

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

Berhati-hatilah karena untuk bilangan floating point, lebarnya mencakup seluruh format string:

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

Penting untuk diperhatikan bahwa lebar juga dapat disetel secara terprogram dengan menggunakan *sebagai ganti angka dan meneruskan lebar sebagai intparameter:

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

Ini mungkin berguna misalnya jika nilai terbesar yang ingin Anda cetak hanya diketahui saat runtime (disebut maxValdalam contoh berikut):

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

Terakhir, jika Anda tidak ingin mencetak stdouttetapi mengembalikan String, gunakan Sprintfjuga dari paket fmt dengan parameter yang sama:

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

Ada satu cara termudah untuk mencapai ini. Menggunakan

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

fmt.Sprintfmemformat dan mengembalikan string tanpa mencetaknya di mana pun. Di sini %02dtertulis pad nol di kiri untuk nilai yang memiliki <2 jumlah digit. Jika nilai yang diberikan memiliki 2 digit atau lebih, itu tidak akan pad. Sebagai contoh:

  • Jika input 1, output 01.
  • Jika input 12, output akan menjadi 12.
  • Jika masukan 1992, keluaran akan 1992.

Anda dapat menggunakan %03datau lebih untuk lebih banyak pengisi nol.

Jai Prak
sumber
10

Pertanyaan " Daftar format pencetakan di Go lang " mengingatkan kita bahwa ada juga benderanya:

- pad dengan spasi di kanan, bukan di kiri (kolom rata kiri)


Anda dapat melihat lebih banyak contoh padding dengan DaddyOh/golang-samples/pad.go, jika Anda ingin padding dengan urutan string lain (lebih kompleks daripada ' 0' atau ' '):

  • 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)

Lihat 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
VonC
sumber
Eric Palmer menghapus reponya dengan sampel golang sehingga tautan tidak berfungsi lagi.
Konstantin Azizov
1
@Konantin Saya telah memulihkan tautan itu. Semacam.
VonC
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) hasil: "03"

lpad ("12", "0", 6) hasil: "000012"

keyzi
sumber