How to convert a string with either, or . as decimal/thousand separators into a float in Go

1 Answer

0 votes
package main

import (
    "fmt"
    "strings"
    "strconv"
)

func toFloat(input string) float64 {
    commaCount := strings.Count(input, ",")
    dotCount := strings.Count(input, ".")

    lastComma := strings.LastIndex(input, ",")
    lastDot := strings.LastIndex(input, ".")

    str := input

    if commaCount > 0 && dotCount > 0 {
        if lastComma > lastDot {
            str = strings.ReplaceAll(str, ".", "")
            str = strings.ReplaceAll(str, ",", ".")
        } else {
            str = strings.ReplaceAll(str, ",", "")
        }
    } else if commaCount > 0 {
        str = strings.ReplaceAll(str, ".", "")
        str = strings.ReplaceAll(str, ",", ".")
    } else {
        str = strings.ReplaceAll(str, ",", "")
    }

    result, err := strconv.ParseFloat(str, 64)
    if err != nil {
        panic(fmt.Sprintf("Invalid number format: %s", input))
    }

    return result
}

func main() {
    fmt.Printf("%.3f\n", toFloat("1,224,533.533"))
    fmt.Printf("%.3f\n", toFloat("1.224.533,533"))
    fmt.Printf("%.2f\n", toFloat("2.354,67"))
    fmt.Printf("%.2f\n", toFloat("2,354.67"))
}



/*
run:

1224533.533
1224533.533
2354.67
2354.67

*/

 



answered Jun 27, 2025 by avibootz
...