为了账号安全,请及时绑定邮箱和手机立即绑定

将float64转换为不包含[]的字符串

将float64转换为不包含[]的字符串

Go
Cats萌萌 2021-04-15 13:15:49
我正在尝试扫描一些文件夹并对它们进行排序,以找到最高的版本号。{“ 10.1”,“ 9.6”,“ 7.2”},然后建立路径。但是,我得到的是在路径中的[]括号,我需要摆脱这些。这就是我得到的:C:\Program Files\PostgreSQL\[10.1]\bin\psql.exe        root := "C:/Program Files/PostgreSQL"        files, err := ioutil.ReadDir(root)        if err != nil {            return "", err        }        folders := []float64{}        for _, f := range files {            if f.IsDir() {                if converted, err := strconv.ParseFloat(f.Name(),64); err == nil {                    folders = append(folders, converted)                }            }        }        sort.Float64s(folders)        log.Println(folders[len(folders)-1:])        highestVersion := fmt.Sprintf("%v",folders[len(folders)-1:])        execPath = filepath.Join(root, highestVersion, "bin", "psql.exe")         log.Println(execPath)
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

问题在这条线上:

highestVersion := fmt.Sprintf("%v",folders[len(folders)-1:])

%v格式说明,如一些人所说,是“价值”的简写。现在,让我们看一下您的价值:

folders[len(folders)-1:]

您在这里所说的是,“从头folders开始len(folders-1)”。您的变量是一个切片,仅包含中的最后一项folders

通过在值周围使用方括号来打印切片,并且由于您拥有一个值,因此它将打印由方括号括起来的值。

如果只想打印该位置中包含的浮点数,则应删除注释中指定的冒号。我建议您使用fmt动词%f或进行打印%g,具体取决于您的用例。

可以在pkg / fmt文档中找到有关哪些动词可用printf以及其他相关功能的更多信息。


查看完整回答
反对 回复 2021-04-19
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

一种可能的方法是使用正则表达式以确保每个路径都具有预期的格式,并通过子匹配(匹配组)将版本号提取为浮点,然后按其浮点版本号值对路径字符串进行排序并返回最高的。


例如:


func main() {

  paths := []string{

    `C:\Program Files\PostgreSQL\[1.2]\bin\psql.exe`,

    `C:\Program Files\PostgreSQL\[9.6]\bin\psql.exe`,

    `C:\Program Files\PostgreSQL\[10.1]\bin\psql.exe`,

    `C:\Program Files\PostgreSQL\[7.2]\bin\psql.exe`,

  }


  sort.Slice(paths, func(i, j int) bool {

    return parseVersion(paths[i]) >= parseVersion(paths[j])

  })

  fmt.Printf("OK: highest version path = %s\n", paths[0])

  // OK: highest version path = C:\Program Files\PostgreSQL\[10.1]\bin\psql.exe

}


var re = regexp.MustCompile(`C:\\Program Files\\PostgreSQL\\\[(\d+\.\d+)\]\\bin\\psql.exe`)


func parseVersion(s string) float32 {

  match := re.FindStringSubmatch(s)

  if match == nil {

    panic(fmt.Errorf("invalid path %q", s))

  }

  version, err := strconv.ParseFloat(match[1], 32)

  if err != nil {

    panic(err)

  }

  return float32(version)

}

当然,如果这对您的用例很重要,则可以修改路径正则表达式以匹配不同的位置模式。


查看完整回答
反对 回复 2021-04-19
  • 2 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信