package form import ( "errors" "strconv" "strings" ) var ErrBadMeasure = errors.New("Bad measurement") var ErrCalcNotSupported = errors.New("Bad measurement: calc not supported") func parseNum(inStr string) (float64, error) { wholeNum, err := strconv.Atoi(inStr) if err == nil { return float64(wholeNum), nil } floatNum, err := strconv.ParseFloat(inStr, 64) if err == nil { return floatNum, nil } return 0.0, ErrBadMeasure } func ParseMeasure(inStr string) (float64, string, error) { rawPx, err := parseNum(inStr) if err == nil { return rawPx, "px", nil } if strings.HasSuffix(inStr, "rem") { val, err := parseNum(inStr[0 : len(inStr)-3]) return val, "rem", err } if strings.HasSuffix(inStr, "em") { val, err := parseNum(inStr[0 : len(inStr)-2]) return val, "em", err } if strings.HasSuffix(inStr, "px") { val, err := parseNum(inStr[0 : len(inStr)-2]) return val, "px", err } if strings.HasSuffix(inStr, "vw") { val, err := parseNum(inStr[0 : len(inStr)-2]) return val, "vw", err } if strings.HasSuffix(inStr, "vh") { val, err := parseNum(inStr[0 : len(inStr)-2]) return val, "vh", err } if strings.HasSuffix(inStr, "%") { val, err := parseNum(inStr[0 : len(inStr)-1]) return val, "%", err } return 0.0, "", ErrBadMeasure }