Bir sayıyı nasıl yazdırabilirim veya sıfır dolgulu bir dizeyi sabit genişlikte yapmak için nasıl yapabilirim?
Örneğin, numaram varsa 12ve yapmak istersem 000012.
Bir sayıyı nasıl yazdırabilirim veya sıfır dolgulu bir dizeyi sabit genişlikte yapmak için nasıl yapabilirim?
Örneğin, numaram varsa 12ve yapmak istersem 000012.
Yanıtlar:
Fmt paketi bunu sizin için yapabilir:
fmt.Printf("|%06d|%6d|\n", 12, 345)
Çıktı:
|000012| 345|
% 06d'deki 0'a dikkat edin, bu onu 6 genişliğinde yapar ve onu sıfırlarla doldurur. İkincisi boşluklarla doldurulacaktır.
Burada kendiniz deneyin: http://play.golang.org/p/cinDspMccp
Sprintfbunun yerine kullanınPrintf
Kullanım Printfgelen işlevi fmt paketinin bir ile widthait 6ve dolgu karakteri 0:
import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'
widthBiçim belirticisinin ('fiil') hemen önüne bir tamsayı koyarak çalışmaları ayarlama :
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 (ve diğer birçok dil) tarafından desteklenen tek dolgu karakterleri boşluklardır ve 0:
fmt.Printf("%6d", 12) // Default padding is spaces, prints ' 12'
fmt.Printf("%06d", 12) // Change to 0 padding, prints '000012'
Başına bir eksi ekleyerek baskıyı sağa yaslamak mümkündür -:
fmt.Printf("%-6d", 12) // Padding right-justified, prints '12 '
Kayan noktalı sayılar için genişliğin tüm biçim dizesini içerdiğine dikkat edin:
fmt.Printf("%6.1f", 12.0) // Prints '0012.0' (width is 6, precision is 1 digit)
Genişliğin, *bir sayı yerine kullanarak ve genişliği bir intparametre olarak ileterek programlı olarak da ayarlanabileceğini not etmek faydalıdır :
myWidth := 6
fmt.Printf("%0*d", myWidth, 12) // Prints '000012' as before
Bu, örneğin yazdırmak istediğiniz en büyük değer yalnızca çalışma zamanında biliniyorsa yararlı olabilir ( maxValaşağıdaki örnekte çağrılır ):
myWidth := 1 + int(math.Log10(float64(maxVal)))
fmt.Printf("%*d", myWidth, nextVal)
Son olarak, yazdırmak istemiyor stdoutancak bir Dize döndürmek istiyorsanız , aynı parametrelerle fmt paketindenSprintf de kullanın :
s := fmt.Sprintf("%06d", 12) // returns '000012' as a String
Bunu başarmanın en basit bir yolu var. Kullanım
func padNumberWithZero(value uint32) string {
return fmt.Sprintf("%02d", value)
}
fmt.Sprintfherhangi bir yere yazdırmadan bir dizeyi biçimlendirir ve döndürür. Burada %02d<2 basamaklı değer için solda sıfır ped yazıyor. Verilen değer 2 veya daha fazla basamağa sahipse doldurulmayacaktır. Örneğin:
Daha %03dfazla sıfır dolgusu için veya daha fazlasını kullanabilirsiniz .
" Go lang'da baskı formatı listesi " sorusu bize bir bayrağın da olduğunu hatırlatır:
-sol yerine sağda boşluklar bulunan ped (alanı sola yaslayın)
DaddyOh/golang-samples/pad.goDiğer dize dizileriyle ( 0"veya" ' ' den daha karmaşık) doldurmak istiyorsanız, daha fazla dolgu örneği görebilirsiniz :
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)Bakınız 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
Sağ pedi isteyenler için bunu yapabilirsiniz:
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
-sadece boşluk verir, sıfırlara ihtiyacım var.