根据go中的语言环境将货币/浮点数字符串解析为浮点类型

hue*_*ose 5 string parsing type-conversion go

我不知道如何在了解i18n语言环境的基础上,如何对“ float-string”解析为浮点数,而不是对该字符串做任何假设。

例如:德国人像我一样,写“ 1.234,87”,而美国人写“ 1,234.87”。在我的项目中,我确实知道我期望使用哪种语言环境,但是我不想“硬编码”关于该本地语言如何编写这些内容的假定。

我不喜欢做regexp / stringreplacements。

有没有一种通用的方式来表达类似

myFloat := ParseFloatByLocale("1.234,76", "DE-DE")
// myFloat => 1234.76
Run Code Online (Sandbox Code Playgroud)

strconv似乎没有此功能,也没有 x/text/language

感谢任何提示!

ret*_*oot 6

您最好的选择是使用标准库的strconv. 您可以制作自己的包装器和语言环境。最终我会添加更多错误检查并将其转换为它自己的包,但这是一个想法。如果你还没有找到一个包,你很有可能不得不自己编写一个包。对于更通用的解决方案,您必须考虑每一个可能的输入......在其他人使用你的工具时将其标准化并强制执行这些规则......考虑到 if 语句和片段的数量,这将是一个更复杂的解决方案逻辑.. 好的部分是你知道输入的类型strconv.ParseFloat期望.. 所以你真正需要做的就是获取用户输入并将其转换为编程标准http://floating-point-gui.de/formats /帧/. 给定的数字大多是通用的,除了逗号和小数点,不应该有很多用例。您甚至可以进一步概括并说有两种主要格式.. https://www.quora.com/Why-do-some-countries-use-a-period-and-others-use-a-comma -to-separate-large-numbers,主要分为欧洲等和英国/美国,德国几乎所有欧洲都使用该标准。在这种假设下,由于用例归结为 2 个,因此实际上没有什么可做的。

package main

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

func normalizeGerman(old string) string {
    s := strings.Replace(old, ",", ".", -1)
    return strings.Replace(s, ".", "", 1)
}
func normalizeAmerican(old string) string {
    return strings.Replace(old, ",", "", -1)
}

var locale map[string]func(string) string

func init() {
    locale = make(map[string]func(string) string)
    locale["DE-DE"] = normalizeGerman
    locale["US"] = normalizeAmerican
}

func main() {
    var f, f2 float64
    var err error
    // german
    if val, ok := locale["DE-DE"]; ok {
        f, err = strconv.ParseFloat(val("1.234,87"), 64)
        if err != nil {
            log.Fatal("german fail", err)
        }
    }
    //american
    if val, ok := locale["US"]; ok {
        f2, err = strconv.ParseFloat(val("1,234.87"), 64)
        if err != nil {
            log.Fatal("american fail", err)
        }
    }

    fmt.Println(f, f2)

}
Run Code Online (Sandbox Code Playgroud)