将float64转换为结果中不含[]的字符串

时间:2018-07-26 19:13:48

标签: go

我正在尝试扫描一些文件夹并对它们进行排序,以找到最高的版本号。 {“ 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 个答案:

答案 0 :(得分:1)

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

例如:

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

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

答案 1 :(得分:1)

问题在这条线上:

"/apis/xxxx.io", "/apis/xxxx.io/v1alpha1",

正如某些人提到的,import json import logging from flask import Flask, jsonify from flask_cors import CORS from kubernetes import client, config app = Flask(__name__) CORS(app) config.load_incluster_config() api_instance = client.CoreV1Api() def read_file(filename): with open(filename, 'r') as content_file: content = content_file.read() return content def set_configuration(): configuration = client.Configuration() configuration.verify_ssl = False configuration.debug = True return configuration @app.route('/', defaults={'path': ''}) @app.route('/<path:path>') def catch_all(path): logger.info("Request Path: " + path) bearer_header = {"Authorization": "Bearer %s" % read_file('/etc/token')} client.Configuration.set_default(set_configuration()) v1 = client.CoreV1Api() ret = v1.api_client.rest_client.GET('https://kubernetes/', bearer_header) return jsonify(requests.get(url).json()) if __name__ == "__main__": logging.basicConfig(level=10) logger = logging.getLogger(__name__) app.run(host="0.0.0.0", port="5000") 格式说明符是“值”的简写。现在,让我们看看您的价值:

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

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

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

如果只想打印该位置中包含的浮点数,则应按照注释中的指定删除冒号。我建议根据您的使用情况使用fmt动词len(folders-1)folders进行打印。

可以在pkg/fmt docs中找到有关%f和其他相关功能可用的动词的更多信息。