fmt.FormatString în Go

Reconstruiește directiva de formatare (ex. „%8.2f”) în metoda Format a unui tip care implementează fmt.Formatter.

Sintaxă
func FormatString(state State, verb rune) string

Ce face fmt.FormatString

Un tip poate controla complet cum este formatat dacă are metoda Format(f fmt.State, verb rune) (interfața fmt.Formatter). Metoda primește verbul ('v', 'f' etc.) și un fmt.State din care poți afla lățimea, precizia și flag-urile cerute.

fmt.FormatString pune la loc toate aceste informații într-un text: pentru Printf("%-8.2f", x) returnează "%-8.2f". Astfel poți păstra exact formatarea cerută de utilizator și doar să adaugi ceva în jur, cum ar fi o unitate de măsură.

Este o funcție pentru cazuri avansate. Pentru o afișare personalizată obișnuită ajunge metoda String() (fmt.Stringer).

Parametri

Parametru Descriere
state Starea primită în metoda Format; conține lățimea, precizia și flag-urile.
verb Verbul primit în metoda Format.

Ce returnează

Directiva completă ca text, începând cu %, de exemplu "%+8.2f".

Exemple

Exemplul 1: Un preț care păstrează formatarea și adaugă „lei”

package main

import "fmt"

type Lei float64

func (l Lei) Format(f fmt.State, verb rune) {
	directiva := fmt.FormatString(f, verb)
	fmt.Fprintf(f, directiva+" lei", float64(l))
}

func main() {
	p := Lei(12.5)
	fmt.Printf("[%v]\n", p)
	fmt.Printf("[%.2f]\n", p)
	fmt.Printf("[%8.1f]\n", p)
	fmt.Println(p)
}

Rezultat

[12.5 lei]
[12.50 lei]
[    12.5 lei]
12.5 lei

Exemplul 2: Ce directivă primește metoda Format

Tipul afișează doar directiva primită, ca să vezi ce reconstruiește FormatString.

package main

import "fmt"

type Arata struct{}

func (Arata) Format(f fmt.State, verb rune) {
	fmt.Fprint(f, fmt.FormatString(f, verb))
}

func main() {
	var a Arata
	fmt.Printf("%v %d %-5s %+.3f %#x\n", a, a, a, a, a)
}

Rezultat

%v %d %-5s %+.3f %#x

Greșeli frecvente

  • Apelezi în Format fmt.Fprintf(f, directiva, l) cu valoarea de același tip. Fprintf cheamă din nou Format și intră în recursivitate infinită; convertește la tipul de bază (float64(l)).

Comenzi înrudite

  • fmt.Stringer: Interfața tipurilor care știu să se descrie ca text: fmt folosește metoda String() la afișare.
  • fmt.Printf: Afișează text formatat cu %d, %s, %.2f etc.; Sprintf returnează textul, Fprintf îl scrie într-un fișier sau alt Writer.