我不知道如何在了解i18n语言环境的基础上,如何对“ float-string”解析为浮点数,而不是对该字符串做任何假设。
例如:德国人像我一样,写“ 1.234,87”,而美国人写“ 1,234.87”。在我的项目中,我确实知道我希望使用哪种语言环境,但是我不想“硬编码”关于该本地语言如何编写这些内容的假设。
我不喜欢做regexp / stringreplacements。
有没有一种通用的方式来表达类似
myFloat := ParseFloatByLocale("1.234,76", "DE-DE") // myFloat => 1234.76
strconv似乎没有此功能,也没有 x/text/language
strconv
x/text/language
感谢任何提示!
最好的选择是使用标准库的strconv。您可以制作自己的包装器和语言环境的东西。最终,我将添加更多错误检查并将其转换为它自己的程序包,但这是一个主意。如果尚未找到软件包,则很有可能必须编写自己的软件包。对于更通用的解决方案,您必须考虑所有可能的输入..在每个语言环境中对其进行规范化,并在其他人使用您的工具时强制执行这些规则…考虑到if语句和段数,这将是一个更复杂的解决方案逻辑部分。好处是您知道strconv.ParseFloat期望的输入类型。因此,您真正要做的就是获取用户输入并将其转换为编程标准http://floating- point-gui.de/formats / fp /。给定的数字通常是通用的,除了逗号和小数点外,应该没有太多用例。您甚至可以进一步概括一下,并说有两种主要格式。.https ://www.quora.com/Why-do-some-countries-use-a-period-and-others-use-a-逗号- separate-large-numbers,主要分为欧洲等国家和英国/美国,德国几乎在整个欧洲都使用该标准。在这种假设下,由于用例降至2,因此实际上没有什么可做的。
strconv.ParseFloat
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) }