Как отформатировать число int из интерфейса json map [string] {} без экспоненты? - PullRequest
0 голосов
/ 14 мая 2019

Это демо: https://play.golang.org/p/7tpQNlNkHgG

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    jsonStr := `{"code1":10080061,"code2":12.2}`
    data := map[string]interface{}{}
    json.Unmarshal([]byte(jsonStr), &data)
    for k, v := range data {
        fmt.Printf("%v:%v, %v:%f, %v:%.0f\n", k, v, k, v, k, v)
    }
}

Выход:

code1:1.0080061e+07, code1:10080061.000000, code1:10080061
code2:12.2, code2:12.200000, code2:12

Я хочу, чтобы code1 вывел 10080061, а code2 вывел 12.2. Как я могу это сделать.

1 Ответ

1 голос
/ 14 мая 2019

попробуйте этот код

package main

import (
    "encoding/json"
    "fmt"
)

func isIntegral(val float64) bool {
    return val == float64(int(val))
}

func main() {
    jsonStr := `{"code1":10080061,"code2":12.2, "code3": 123.23123, "code4": "string"}`

    data := map[string]interface{}{}
    _ = json.Unmarshal([]byte(jsonStr), &data)

    for k, v := range data {
        switch v.(type) {
        case float64:
           // check the v is integer or float
            if isIntegral(v.(float64)) {
                // if v is an integer, try to cast
                fmt.Printf("%v: %d\n", k, int(v.(float64)))
            } else {
                fmt.Printf("%v: %v\n", k, v)
            }
        default:
            fmt.Printf("%v: %v\n", k, v)
        }
    }
}

выход

code1: 10080061
code2: 12.2
code3: 123.23123
code4: string

исх

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...