-(defun metar-temp-to-number (string)
- "Convert a METAR temperature to a number."
- (if (= (aref string 0) ?M)
- (- (string-to-number (substring string 1)))
- (string-to-number string)))
-
-(defvar metar-url "http://weather.noaa.gov/pub/data/observations/metar/stations/%s.TXT"
+(defun metar-convert-unit (value new-unit)
+ "Convert VALUE to NEW-UNIT.
+VALUE is a string with the value followed by the unit, like \"5 knot\"
+and NEW-UNIT should be a unit name like \"kph\" or similar."
+ (cl-check-type value string)
+ (cl-check-type new-unit (or string symbol))
+ (cl-multiple-value-bind (value unit)
+ (split-string
+ (math-format-value
+ (math-convert-units (math-simplify (math-read-expr value))
+ (math-read-expr
+ (cl-etypecase new-unit
+ (string new-unit)
+ (symbol (symbol-name new-unit))))))
+ " ")
+ (cons (string-to-number value) (intern unit))))
+
+(defun metar-convert-temperature (string &optional unit)
+ (let* ((value (concat (if (= (aref string 0) ?M)
+ (concat "-" (substring string 1))
+ string)
+ "degC"))
+ (expr (math-read-expr value))
+ (old-unit (math-single-units-in-expr-p expr))
+ (new-unit (or unit (cdr (assq 'temperature metar-units)))))
+ (if old-unit
+ (cl-multiple-value-bind (value unit)
+ (split-string
+ (math-format-value
+ (math-simplify-units
+ (math-convert-temperature
+ expr
+ (list 'var
+ (car old-unit)
+ (intern (concat "var-" (symbol-name (car old-unit)))))
+ (math-read-expr (cl-etypecase new-unit
+ (string new-unit)
+ (symbol (symbol-name new-unit))))))) " ")
+ (cons (string-to-number value) (intern unit))))))
+
+(defcustom metar-url
+ "http://weather.noaa.gov/pub/data/observations/metar/stations/%s.TXT"