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ố 12
và tôi muốn làm cho nó 000012
.
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ố 12
và tôi muốn làm cho nó 000012
.
Câu trả lời:
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
Sprintf
thay vìPrintf
Sử dụng các Printf
chức năng từ gói fmt với một width
số 6
và nhân vật đệm 0
:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
Thiết lập các width
hoạ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 int
tham 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 maxVal
trong 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 stdout
nhưng trả về một Chuỗi, hãy sử dụng Sprintf
cả gói fmt có cùng tham số:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
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 %02d
nó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ụ:
Bạn có thể sử dụng %03d
hoặc nhiều hơn để có thêm phần đệm số 0.
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
-
chỉ cung cấp dấu cách, tôi cần số không.