Golang: วิธีการเติมตัวเลขด้วยศูนย์เมื่อพิมพ์?


115

ฉันจะพิมพ์ตัวเลขหรือสร้างสตริงโดยมีช่องว่างภายในเป็นศูนย์เพื่อให้มีความกว้างคงที่ได้อย่างไร

ตัวอย่างเช่นถ้าฉันมีจำนวนและฉันต้องการที่จะให้มัน12000012

คำตอบ:


191

แพ็คเกจ fmt สามารถทำสิ่งนี้ให้คุณได้:

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

เอาท์พุต:

|000012|   345|

สังเกต 0 ใน% 06d ซึ่งจะทำให้มีความกว้างเป็น 6 และใส่เลขศูนย์ อันที่สองจะรองด้วยช่องว่าง

ลองด้วยตัวคุณเองที่นี่: http://play.golang.org/p/cinDspMccp


3
จะทำอย่างไรถ้าฉันต้องการให้แผ่นอยู่ทางขวา? การใช้แฟล็ก-ให้ช่องว่างเท่านั้นฉันต้องการเลขศูนย์
majidarif

6
หากคุณต้องการให้สตริงใช้งานได้ในภายหลังให้ใช้SprintfแทนPrintf
oliverpool

51

ใช้Printfฟังก์ชั่นจากแพ็คเกจ fmtด้วย a widthof 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

1
เป็นคำตอบที่น่าทึ่ง แต่ฉันต้องการแก้ไขข้อบกพร่องเล็ก ๆ fmt.Printf("%6.1f", 12.0)ไม่พิมพ์0012.0แต่เป็น "12.0" (ช่องว่างภายใน) ในการเติม 0 เราจำเป็นต้องใช้fmt.Printf("%06.1f", 12.0)แทน
mazend

30

มีวิธีหนึ่งที่ง่ายที่สุดในการบรรลุเป้าหมายนี้ ใช้

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

fmt.Sprintfจัดรูปแบบและส่งคืนสตริงโดยไม่ต้องพิมพ์ที่ใดก็ได้ ในที่นี้%02dบอกว่า pad zero ทางด้านซ้ายสำหรับค่าที่มีตัวเลข <2 หลัก หากค่าที่กำหนดมี 2 หลักขึ้นไปก็จะไม่เพิ่ม ตัวอย่างเช่น:

  • หากอินพุตเป็น 1 เอาต์พุตจะเป็น 01
  • หากอินพุตเป็น 12 เอาต์พุตจะเป็น 12
  • หากอินพุตเป็น 1992 เอาต์พุตจะเป็น 1992

คุณสามารถใช้%03dหรือมากกว่าสำหรับช่องว่างภายในเพิ่มเติมได้


11

คำถาม " รายการรูปแบบการพิมพ์ใน 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 ลบ repo ของเขาด้วยตัวอย่าง golang ดังนั้นลิงค์จึงไม่ทำงานอีกต่อไป
G07cha

1
@KonstantinAzizov จุดดี. ฉันกู้คืนลิงก์นั้นแล้ว เรียงลำดับจาก.
VonC


0

สำหรับผู้ที่ต้องการแผ่นด้านขวาคุณสามารถทำได้:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.