2016-04-09 6 views
1

Stellen Sie sich in einer 12 feste Breite Tabelle zum Drucken brauchen wir den Druck float64 Zahlen:Golang: Gibt es irgendeine Standardbibliothek, um float64 in eine Zeichenkette mit fester Breite mit maximaler Anzahl signifikanter Stellen zu konvertieren?

fmt.Printf("%12.6g\n", 9.405090880450127e+119) //"9.40509e+119" 
fmt.Printf("%12.6g\n", 0.1234567890123)  //" 0.123457" 
fmt.Printf("%12.6g\n", 123456789012.0)   //" 1.23457e+11" 

Wir 0,1234567890 lieber „0,123457“ wir verlieren 6 signifikante Stellen.
Wir bevorzugen 123456789012 zu "1.23457e + 11" wir verlieren 6 signifikante Ziffern.

Gibt es eine Standardbibliothek, float64 in string mit fester Breite mit maximaler Anzahl von signifikanten Ziffern zu konvertieren? Vielen Dank im Voraus.

Antwort

2

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 
Verwandte Themen