Голанг: Як підписати число нулями під час друку?


99

Як я можу надрукувати номер або зробити рядок із нульовим накладом, щоб він зміг встановити ширину?

Наприклад, якщо у мене є номер, 12і я хочу його зробити 000012.

Відповіді:


176

Пакет fmt може зробити для вас це:

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

Зверніть увагу на 0 в% 06d, що зробить його шириною 6 і обкладіть нулями. Другий буде заповнено пробілами.

Ви можете побачити його в дії тут: http://play.golang.org/p/cinDspMccp


2
Що робити, якщо я хочу, щоб майданчик знаходився праворуч? використання прапора -дає лише пробіли, мені потрібні нулі.
majidarif

5
Якщо ви хочете, щоб струна пізніше працювала, використовуйте SprintfзамістьPrintf
oliverpool

42

Використовуйте Printfфункцію з FMT пакета з widthз 6і відступу характеру 0:

import "fmt"
fmt.Printf("%06d", 12) // Prints to stdout '000012'

Встановлення widthтвору шляхом введення цілого числа, що безпосередньо передує специфікатору формату ('verb'):

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("%6.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

29

Є один найпростіший спосіб цього досягти. Використовуйте

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

fmt.Sprintfформатує і повертає рядок, не друкуючи ніде. Тут %02dговориться про нульову клавішу зліва для значення, яке має <2 цифри. Якщо дане значення має 2 або більше цифр, воно не заповнюється. Наприклад:

  • Якщо вхід 1, вихід буде 01.
  • Якщо вхід 12, вихід буде 12.
  • Якщо введено 1992, виведено 1992.

Ви можете використовувати %03dабо більше для більшої кількості нульових відступів.


10

Питання " Список формату друку в 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

Ерік Палмер видалив його репо із зразками голангу, тому посилання більше не працює.
Костянтин Азізов

1
@KonstantinAzizov Хороший момент. Я відновив це посилання. Різновид.
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) результат: "03"

lpad ("12", "0", 6) результат: "000012"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.