Golang: Yazdırırken bir sayı nasıl sıfırlanır?


108

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:


183

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


2
Ya pedin sağda olmasını istersem? bayrağı kullanmak -sadece boşluk verir, sıfırlara ihtiyacım var.
majidarif

5
Daha sonra çalışmak için bir dizge istiyorsanız, Sprintfbunun yerine kullanınPrintf
oliverpool

48

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

30

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:

  • Giriş 1 ise, çıkış 01 olacaktır.
  • Giriş 12 ise, çıkış 12 olacaktır.
  • Girdi 1992 ise çıktı 1992 olacaktır.

Daha %03dfazla sıfır dolgusu için veya daha fazlasını kullanabilirsiniz .


11

" 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

Eric Palmer depoyu golang örnekleri ile kaldırdı, bu yüzden bağlantı artık çalışmıyor.
Konstantin Azizov

1
@KonstantinAzizov İyi nokta. O bağlantıyı geri yükledim. Tür.
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) sonuç: "03"

lpad ("12", "0", 6) sonuç: "000012"


0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.