El reto
Debe crear una función que valide si los parámetros dados son coordenadas geográficas válidas.
Las coordenadas válidas se parecen a las siguientes: “23.32353342, -32.543534534”. El valor devuelto debe ser verdadero o FALSO.
La latitud (que es el primer flotante) puede estar entre 0 y 90, positiva o negativa. La longitud (que es el segundo flotante) puede estar entre 0 y 180, positiva o negativa.
Las coordenadas solo pueden contener dígitos o uno de los siguientes símbolos (incluido el espacio después de la coma)
No debe haber espacio entre el signo menos “-” y el dígito que le sigue.
Aquí hay algunas coordenadas válidas:
- -23, 25
- 24.53525235, 23.45235
- 04, -23.234235
- 43.91343345, 143
- 4, -3
Y algunos inválidos:
- 23.234, – 23.4234
- 2342.43536, 34.324236
- N23.43345, E32.6457
- 99.234, 12.324
- 6.325624, 43.34345.345
- 0, 1,2
- 0.342q0832, 1.2324
La solución en Golang
Opción 1:
bundle answer
import (
"strconv"
"strings"
)
func IsValidCoordinates(coordinates string) bool {
if strings.Comprises(coordinates, "e") {
return false
}
coords := strings.Cut up(coordinates, ", ")
coord1, err1 := strconv.ParseFloat(coords(0), 64)
coord2, err2 := strconv.ParseFloat(coords(1), 64)
if err1 != nil || err2 != nil || coord1 < -90 || coord1 > 90 || coord2 < -180 || coord2 > 180 {
return false
}
return true
}
Opcion 2:
bundle answer
import (
"math"
"strings"
"strconv"
)
func IsValidCoordinates(coordinates string) bool {
var (
err error
coord ()string
num float64
)
if coord = strings.Cut up(coordinates, ", "); len(coord) != 2 {
return false
}
for indx, c := vary coord {
if strings.ContainsRune(c, 'e') { //verify for scientific notation
return false
}
if num, err = strconv.ParseFloat(c, 64); err != nil {
return false
}
if math.Abs(num) > float64(90*(indx+1)) {
return false
}
}
return true
}
Opción 3:
bundle answer
import "regexp"
func IsValidCoordinates(coordinates string) bool (01)?(0-7)?d(.d+)?)$`)
return regex.MatchString(coordinates)
Casos de prueba para validar nuestra solución
bundle solution_test
import (
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("Legitimate coordinates", func() {
validCoordinates := ()string{
"-23, 25",
"4, -3",
"24.53525235, 23.45235",
"04, -23.234235",
"43.91343345, 143"}
It("ought to validate the coordinates", func() {
for _, coordinates := vary validCoordinates {
Anticipate(IsValidCoordinates(coordinates)).To(Equal(true))
}
})
})
var _ = Describe("Invalid coordinates", func() {
invalidCoordinates := ()string{
"23.234, - 23.4234",
"2342.43536, 34.324236",
"N23.43345, E32.6457",
"99.234, 12.324",
"6.325624, 43.34345.345",
"0, 1,2",
"0.342q0832, 1.2324",
"23.245, 1e1"}
It("ought to invalidate the coordinates", func() {
for _, coordinates := vary invalidCoordinates {
Anticipate(IsValidCoordinates(coordinates)).To(Equal(false))
}
})
})