I find very strange that the ANSI specification defines the function DIGIT-CHAR, but doesn't also define CHAR-DIGIT. It would be nice to have it in alexandria.
One can use char-code to implement it, but only assuming that the char-code of alphabetic characters are sequential (which happens very oftenly, I don't know any implementation in which this may not work, but this behaviour is not required by the specification).
So, here is my suggestion:
(defun char-digit (char &optional (radix 10))
"Takes a character and returns its weight.
Signals an error if char is not a digit character in the given radix."
(assert (digit-char-p char radix) (char) "Character ~a is not a digit character." char)
(let ((char (char-upcase char)))
#+(or sbcl clisp ecl cmucl openmcl
allegro lispworks corman gcl abcl unicode)
(cond
((char<= #\0 char #\9)
(- (char-code char) (char-code #\0)))
((char<= #\A char #\Z)
(+ 10 (- (char-code char) (char-code #\A))))
(t nil))
#-(or sbcl clisp ecl cmucl openmcl
allegro lispworks corman gcl abcl unicode)
(parse-integer (string char) :radix radix)))
I tested and it works. Well, I am open to suggestions, and feel free to include this code in alexandria as well.
Gustavo.