Чтение пользовательского ввода и разбиение его на два числа float64 - PullRequest
0 голосов
/ 03 мая 2018

У меня есть функция для чтения одного float64 из стандартного ввода:

func readFloat() float64 {

    scanner := bufio.NewScanner(os.Stdin)

    for {
        scanner.Scan()
        in := scanner.Text()

        n, err := strconv.ParseFloat(in, 64)

        if err == nil {
            return n
        } else {
            fmt.Println("ERROR:", err)
            fmt.Print("\nPlease enter a valid number: ")
        }
    }
}

Я хотел бы изменить это, чтобы прочитать два числа с плавающей запятой, например,

func main() {
    fmt.Print("\nEnter x, y coordinates for point1: ")
    x1, y1 := readFloat()

Проблема, с которой я сталкиваюсь, разделяется scanner.Text(). Есть функция scanner.Split(), но она не может понять, как ее использовать.

Любые возможные решения будут полезны.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я бы, наверное, пошел с fmt.Sscanf здесь

package main

import (
    "fmt"
)

func main() {
    testCases := []string{"1,2", "0.1,0.2", "1.234,2.234"}
    var a, b float64
    for _, s := range testCases {
        _, err := fmt.Sscanf(s, "%f,%f", &a, &b)

        if err != nil {
            panic(err)
        }
        fmt.Printf("Got %f, %f\n", a, b)
    }

}

Выход:

Got 1.000000, 2.000000
Got 0.100000, 0.200000
Got 1.234000, 2.234000

https://play.golang.org/p/7ATyjlkPhnD

0 голосов
/ 03 мая 2018

Использование strings.Split:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func readFloat() (float64, float64) {

    scanner := bufio.NewScanner(os.Stdin)

    for {
        scanner.Scan()
        in := scanner.Text()
        parts := strings.Split(in, ",")
        x, err := strconv.ParseFloat(parts[0], 64)
        if err != nil {
            fmt.Println("ERROR:", err)
            fmt.Print("\nPlease enter a valid number: ")
        }
        y, err := strconv.ParseFloat(parts[1], 64)
        if err != nil {
            fmt.Println("ERROR:", err)
            fmt.Print("\nPlease enter a valid number: ")
        }
        return x, y
    }
}

func main() {
    fmt.Print("\nEnter x, y coordinates for point1: ")
    x1, y1 := readFloat()
    fmt.Println(x1, y1)
}

Используя его:

$ go run main.go
Enter x, y coordinates for point1: 1.2,3.4
1.2 3.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...