Home > database >  String to float64 receiving format ".01"
String to float64 receiving format ".01"

Time:10-10

If I receive from an API a string obeying the format of ".01", and I have a struct like this:

type Mystruct struct { Val float64 json:"val,string" }

In this case, I receive trying to unmarshal val into float64. Is there a way I can accomplish this?

CodePudding user response:

Add a string field to capture the string value:

type Mystruct struct {
    Val  float64 `json:"-"`
    XVal string  `json:"val"`
}

Unmarshal the JSON document. Convert the string value to a float value:

var v Mystruct
err := json.Unmarshal([]byte(data), &v)
if err != nil {
    log.Fatal(err)
}
v.Val, err = strconv.ParseFloat(v.XVal, 64)
if err != nil {
    log.Fatal(err)
}

CodePudding user response:

I recommand defining a type alias which you can use it anywhere.

package main

import (
    "encoding/json"
    "fmt"
    "strconv"
    "strings"
)

type MyFloat64 float64

func (f *MyFloat64) UnmarshalJSON(data []byte) error {
    raw := string(data)
    raw = strings.TrimPrefix(raw, "\"")
    raw = strings.TrimSuffix(raw, "\"")
    if parsedFloat, err := strconv.ParseFloat(raw, 64); err != nil {
        return err
    } else {
        *f = MyFloat64(parsedFloat)
        return nil
    }
}

type MyObj struct {
    Val1 MyFloat64
    Val2 string
}

func main() {
    j := `{"Val1":"0.01", "Val2":"0.01"}`
    o := MyObj{}
    err := json.Unmarshal([]byte(j), &o)
    if err != nil {
        fmt.Println(err)
    } else {
        b, _ := json.Marshal(o)
        fmt.Println("in:", j)
        fmt.Println("out:", string(b))
    }
}

output:

in: {"Val1":"0.01", "Val2":"0.01"}
out: {"Val1":0.01,"Val2":"0.01"}
  •  Tags:  
  • go
  • Related