go - 将字符串从一种奇怪的格式转换为 float

标签 go

如何将字符串从不常见的格式(例如 2.93B、201k)转换为 float ?使用常规方法不起作用,即:

i, err := strconv.ParseFloat("2.93B", 64) // Returns an 'invalid syntax' error

最佳答案

例如,

package main

import (
    "fmt"
    "strconv"
    "unicode/utf8"
)

var siFactors = map[string]float64{
    "":  1e0,
    "k": 1e3,
    "M": 1e6, // Sometimes, M (Roman numeral) for thousands and MM for millions
    "G": 1e9,
    "T": 1e12,
    "P": 1e15,
    "E": 1e18,
    "Z": 1e21,
    "Y": 1e24,
    "K": 1e3, // colloquial synonym for "k"
    "B": 1e9, // colloquial synonym for "G"
}

func parseNumber(s string) (float64, error) {
    f, err := strconv.ParseFloat(s, 64)
    if err == nil {
        return f, nil
    }
    r, size := utf8.DecodeLastRuneInString(s)
    if r == utf8.RuneError {
        return 0, err
    }
    symbol := s[len(s)-size : len(s)]
    factor, ok := siFactors[symbol]
    if !ok {
        return 0, err
    }
    f, e := strconv.ParseFloat(s[:len(s)-len(symbol)], 64)
    if e != nil {
        return 0, err
    }
    return f * factor, nil
}

func main() {
    for _, s := range []string{"2.93", "2.93k", "2.93M", "2.93G", "2.93B", "2930000000", "2.93X", "G"} {
        n, err := parseNumber(s)
        fmt.Printf("%q\t %g %v\n", s, n, err)
    }
}

Playground :https://play.golang.org/p/DYEe5gQ8pl

输出:

"2.93"   2.93 <nil>
"2.93k"  2930 <nil>
"2.93M"  2.93e+06 <nil>
"2.93G"  2.93e+09 <nil>
"2.93B"  2.93e+09 <nil>
"2930000000"     2.93e+09 <nil>
"2.93X"  0 strconv.ParseFloat: parsing "2.93X": invalid syntax
"B"  0 strconv.ParseFloat: parsing "B": invalid syntax

关于go - 将字符串从一种奇怪的格式转换为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774897/

相关文章:

走。在服务器程序中获取错误 i/o 超时

go websockets with gorilla libs - 未知的 json 响应,所以无法映射它

ajax - 从ajax请求并发写入文件

rest - 在 Go 中将路由注册到中心对象

go - 如何检测当前 Go 进程是否在 headless (headless)(非 GUI)环境中运行?

amazon-web-services - AWS Golang SDK-如何将DeleteOnTermination放在EBS卷上?

function - Golang 函数指针作为结构的一部分

go - GoLang 上的反射错误 - 参数太少

go - 不能使用 Context 作为类型 "handlerfunc"gin-gonic

在 TFS 构建创建中找不到 Go 语言模板