Golang: Làm thế nào để chèn một số bằng các số không khi in?


99

Làm cách nào để in một số hoặc tạo một chuỗi không có khoảng đệm để làm cho nó có chiều rộng cố định?

Ví dụ, nếu tôi có số 12và tôi muốn làm cho nó 000012.

Câu trả lời:


176

Gói fmt có thể làm điều này cho bạn:

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

Lưu ý số 0 trong% 06d, điều đó sẽ làm cho nó có chiều rộng là 6 và đệm nó bằng các số không. Cái thứ hai sẽ có khoảng trống.

Bạn có thể thấy nó hoạt động tại đây: http://play.golang.org/p/cinDspMccp


2
Nếu tôi muốn miếng đệm ở bên phải thì sao? sử dụng cờ -chỉ cung cấp dấu cách, tôi cần số không.
majidarif

5
Nếu bạn muốn có một chuỗi công việc sau này với, sử dụng Sprintfthay vìPrintf
oliverpool

42

Sử dụng các Printfchức năng từ gói fmt với một widthsố 6và nhân vật đệm 0:

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

Thiết lập các widthhoạt động bằng cách đặt một số nguyên trực tiếp trước định dạng định dạng ('động từ'):

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'

Các ký tự đệm duy nhất được hỗ trợ bởi Golang (và hầu hết các ngôn ngữ khác) là dấu cách và 0:

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

Có thể căn phải bản in bằng cách thêm dấu trừ -:

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

Hãy lưu ý rằng đối với số dấu phẩy động, chiều rộng bao gồm toàn bộ chuỗi định dạng:

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

Điều hữu ích cần lưu ý là chiều rộng cũng có thể được đặt theo chương trình bằng cách sử dụng *thay vì một số và chuyển chiều rộng dưới dạng inttham số:

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

Điều này có thể hữu ích, chẳng hạn nếu giá trị lớn nhất bạn muốn in chỉ được biết trong thời gian chạy (được gọi maxValtrong ví dụ sau):

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

Cuối cùng, nếu bạn không muốn in ra stdoutnhưng trả về một Chuỗi, hãy sử dụng Sprintfcả gói fmt có cùng tham số:

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

29

Có một cách đơn giản nhất để đạt được điều này. Sử dụng

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

fmt.Sprintfđịnh dạng và trả về một chuỗi mà không cần in nó ở bất kỳ đâu. Ở đây %02dnói pad số 0 ở bên trái cho giá trị có <2 số chữ số. Nếu giá trị đã cho có 2 chữ số trở lên, nó sẽ không đệm. Ví dụ:

  • Nếu đầu vào là 1, đầu ra sẽ là 01.
  • Nếu đầu vào là 12, đầu ra sẽ là 12.
  • Nếu đầu vào là năm 1992 thì đầu ra sẽ là năm 1992.

Bạn có thể sử dụng %03dhoặc nhiều hơn để có thêm phần đệm số 0.


10

Câu hỏi " Danh sách định dạng in trong Go lang " nhắc nhở chúng ta rằng có một lá cờ:

- đệm có khoảng trắng ở bên phải thay vì bên trái (căn trái trường)


Bạn có thể xem thêm các ví dụ về đệm với DaddyOh/golang-samples/pad.go, nếu bạn muốn đệm bằng các chuỗi chuỗi khác (phức tạp hơn ' 0' hoặc ' '):

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

Xem 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 đã xóa repo của anh ấy với các mẫu golang nên liên kết không hoạt động nữa.
Konstantin Azizov

1
@KonstantinAzizov Điểm tốt. Tôi đã khôi phục liên kết đó. Sắp xếp.
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) kết quả: "03"

lpad ("12", "0", 6) kết quả: "000012"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.