Source
(defun parse-float (float-string
&key (start 0) (end nil) (radix 10)
(junk-allowed t)
(type 'single-float)
(decimal-character #\.))
(let ((radix-array (radix-values radix))
(integer-part 0)
(mantissa 0)
(mantissa-size 1)
(sign 1))
(with-input-from-string (float-stream (string-upcase (trim-string float-string)) :start start :end end)
(labels ((peek () (peek-char nil float-stream nil nil nil))
(next () (read-char float-stream nil nil nil))
(sign () ;; reads the (optional) sign of the number
(cond
((char= (peek) #\+) (next) (setf sign 1))
((char= (peek) #\-) (next) (setf sign -1)))
(integer-part))
(integer-part ()
(cond
((position (peek) radix-array)
;; the next char is a valid char
(setf integer-part (+ (* integer-part radix)
(position (next) radix-array)))
;; again
(return-from integer-part (integer-part)))
((null (peek))
;; end of string
(done))
((char= decimal-character (peek))
;; the decimal seperator
(next)
(return-from integer-part (mantissa)))
;; junk
(junk-allowed (done))
(t (bad-string))))
(mantissa ()
(cond
((position (peek) radix-array)
(setf mantissa (+ (* mantissa radix)
(position (next) radix-array))
mantissa-size (* mantissa-size radix))
(return-from mantissa
(mantissa)))
((or (null (peek)) junk-allowed)
;; end of string
(done))
(t (bad-string))))
(bad-string ()
(error "Unable to parse ~S." float-string))
(done ()
(return-from parse-float
(coerce (* sign (+ integer-part (/ mantissa mantissa-size))) type))))
(sign)))))
Source Context