web-dev-qa-db-fra.com

Comment imprimer un float sous forme de chaîne dans Golang sans notation scientifique

Supposons que j'ai un tableau avec 2 éléments dont le type est string/float . Comment les imprimer ensemble sans notation scientifique pour l'élément float.

Par exemple:

package main

import (
    "fmt"
)

func main() {
    values := []interface{}{"mydata", 1234567890.123}
    for _, v := range values{
        fmt.Printf("%v\n", v)
    }
}

La sortie sera

mes données

1.234567890123e + 09

Ce que je veux c'est

mes données

1234567890.123

4
MengCheng Wei

Le paquet de documentation de fmt l'explique: Le verbe %v est le format par défaut, ce qui pour des nombres flottants signifie/revient à %g qui est

% e pour les grands exposants,% f sinon. La précision est discutée ci-dessous.

Si vous voulez toujours "point décimal mais pas d’exposant, par exemple 123,456", utilisez %f explicitement.

Mais vous ne pouvez l'utiliser que pour des nombres flottants, vous devez donc vérifier le type de la valeur que vous imprimez. Pour cela, vous pouvez utiliser une assertion de type type ou une assertion de type .

Exemple:

switch v.(type) {
case float64, float32:
    fmt.Printf("%f\n", v)
default:
    fmt.Printf("%v\n", v)
}

Sortie (essayez-le sur le Go Playground ):

mydata
1234567890.123000
3
icza

Vous pouvez utiliser %f pour imprimer un float . Étant donné votre tranche d'interface, vous devez d'abord vérifier le type de l'élément. Vous pouvez le faire comme suit:

package main

import (
    "fmt"
)

func main() {
    values := []interface{}{"mydata", 1234567890.123}
    for _, v := range values {
        // Check if the type conversion to float64 succeeds.
        if f, ok := v.(float64); ok {
            fmt.Printf("%f\n", f)
        } else {
            fmt.Println(v)
        }
    }
}

Les sorties:

mydata
1234567890.123000

La liste complète des drapeaux pour les flotteurs de fmt est:

%b  decimalless scientific notation with exponent a power of two,
    in the manner of strconv.FormatFloat with the 'b' format,
    e.g. -123456p-78
%e  scientific notation, e.g. -1.234456e+78
%E  scientific notation, e.g. -1.234456E+78
%f  decimal point but no exponent, e.g. 123.456
%F  synonym for %f
%g  %e for large exponents, %f otherwise. Precision is discussed below.
%G  %E for large exponents, %F otherwise
0
Marc