Grundsätzlich haben Sie 2 Ausgabeformate: entweder eine wissenschaftliche Notation oder eine normale Form. Der Wendepunkt zwischen diesen beiden Formaten ist 1e12
.
So können Sie verzweigen, wenn x >= 1e12
. In beiden Zweigen können Sie eine Formatierung mit 0-stelligen Ziffern vornehmen, um zu sehen, wie lang die Zahl sein wird. Sie können also berechnen, wie viele Nachkommastellen für die Breite 12 passen, und Sie können die endgültige Formatzeichenfolge mit der berechneten Genauigkeit erstellen .
Der Pre-Check auch in der wissenschaftlichen Notation erforderlich ist (%g
), weil die Breite des Exponenten (z.B. e+1
, e+10
, e+100
) variiert.
Hier ist eine Beispielimplementierung. Dies soll Ihnen den Einstieg, aber es bedeutet nicht, alle Fälle zu behandeln, und es ist nicht die effizienteste Lösung (aber relativ einfach und macht den Job):
// format12 formats x to be 12 chars long.
func format12(x float64) string {
if x >= 1e12 {
// Check to see how many fraction digits fit in:
s := fmt.Sprintf("%.g", x)
format := fmt.Sprintf("%%12.%dg", 12-len(s))
return fmt.Sprintf(format, x)
}
// Check to see how many fraction digits fit in:
s := fmt.Sprintf("%.0f", x)
if len(s) == 12 {
return s
}
format := fmt.Sprintf("%%%d.%df", len(s), 12-len(s)-1)
return fmt.Sprintf(format, x)
}
Testing es:
fs := []float64{0, 1234.567890123, 0.1234567890123, 123456789012.0, 1234567890123.0,
9.405090880450127e+9, 9.405090880450127e+19, 9.405090880450127e+119}
for _, f := range fs {
fmt.Println(format12(f))
}
Output (versuchen sie es auf dem Go Playground):
0.0000000000
0.1234567890
1234.5678901
123456789012
1.234568e+12
9405090880.5
9.405091e+19
9.40509e+119