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
Formatfmt.Fprintf(f, directiva, l)cu valoarea de același tip.Fprintfcheamă din nouFormatș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.