ฉันจะพิมพ์ตัวเลขหรือสร้างสตริงโดยมีช่องว่างภายในเป็นศูนย์เพื่อให้มีความกว้างคงที่ได้อย่างไร
ตัวอย่างเช่นถ้าฉันมีจำนวนและฉันต้องการที่จะให้มัน12
000012
ฉันจะพิมพ์ตัวเลขหรือสร้างสตริงโดยมีช่องว่างภายในเป็นศูนย์เพื่อให้มีความกว้างคงที่ได้อย่างไร
ตัวอย่างเช่นถ้าฉันมีจำนวนและฉันต้องการที่จะให้มัน12
000012
คำตอบ:
แพ็คเกจ fmt สามารถทำสิ่งนี้ให้คุณได้:
fmt.Printf("|%06d|%6d|\n", 12, 345)
เอาท์พุต:
|000012| 345|
สังเกต 0 ใน% 06d ซึ่งจะทำให้มีความกว้างเป็น 6 และใส่เลขศูนย์ อันที่สองจะรองด้วยช่องว่าง
ลองด้วยตัวคุณเองที่นี่: http://play.golang.org/p/cinDspMccp
Sprintf
แทนPrintf
ใช้Printf
ฟังก์ชั่นจากแพ็คเกจ fmtด้วย a width
of 6
และอักขระ padding 0
:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
การตั้งค่าความกว้างทำงานโดยการใส่จำนวนเต็มที่นำหน้าตัวระบุรูปแบบ ('กริยา'):
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("%06.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
แต่ส่งคืน String ให้ใช้Sprintf
จากแพ็คเกจ fmtด้วยพารามิเตอร์เดียวกัน:
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
fmt.Printf("%6.1f", 12.0)
ไม่พิมพ์0012.0
แต่เป็น "12.0" (ช่องว่างภายใน) ในการเติม 0 เราจำเป็นต้องใช้fmt.Printf("%06.1f", 12.0)
แทน
มีวิธีหนึ่งที่ง่ายที่สุดในการบรรลุเป้าหมายนี้ ใช้
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintf
จัดรูปแบบและส่งคืนสตริงโดยไม่ต้องพิมพ์ที่ใดก็ได้ ในที่นี้%02d
บอกว่า pad zero ทางด้านซ้ายสำหรับค่าที่มีตัวเลข <2 หลัก หากค่าที่กำหนดมี 2 หลักขึ้นไปก็จะไม่เพิ่ม ตัวอย่างเช่น:
คุณสามารถใช้%03d
หรือมากกว่าสำหรับช่องว่างภายในเพิ่มเติมได้
คำถาม " รายการรูปแบบการพิมพ์ใน 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)
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
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"
สำหรับผู้ที่ต้องการแผ่นด้านขวาคุณสามารถทำได้:
str2pad := "12"
padWith := "0"
amt2pad := 6
//This will make sure there is always 6 characters total, padded on the right side
//Note to check if strings.Repeat returns a negative value
paddedStr := str2pad + strings.Repeat(padWith, amt2pad - len(str2pad))
//Outputs 120000
-
ให้ช่องว่างเท่านั้นฉันต้องการเลขศูนย์