string - 根据语言环境将货币/浮点字符串解析为浮点类型

标签 string parsing go type-conversion

我很困惑如何根据对 i18n-locale 的了解而不对字符串进行假设,将“float-string”解析为 float。

示例:当美国人写“1,234.87”时,德国人和我一样写“1.234,87”。在我的项目中,我确实知道我期望的语言环境,但我不想“硬编码”我对本地如何编写这些东西的假设。

我不想做正则表达式/字符串替换。

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

myFloat := ParseFloatByLocale("1.234,76", "DE-DE")
// myFloat => 1234.76

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-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)

}

关于string - 根据语言环境将货币/浮点字符串解析为浮点类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45079074/

相关文章:

javascript - Reshape String,每N个字符插入 "\n"

c - libxml2 C 库 : SAX push parser context: xmlParseChunk error when passed null terminated string

java - 使用 cgo 从 Go 返回 String[]

java - 如何获取以派生字符开头的名称的节字符

php - 如何删除文本中的最后一个字符?

C# 不会编译在开头附近带有\0 的长 const 字符串

c# - 将具有可变属性的 JSON 对象解析为强类型对象

scala - 是否可以使用 scala 宏来构造类型?

windows - 获取syscall.CreateProcess的输出

go - 从 exec.Command 写入文件