This accepts a character which is a numeric digit and returns its value as a digit, or #f if it's not a digit:
(digit-value #\3) => 3 (digit-value #\x0664) => 4 (digit-value #\x0EA6) => 0You need the following list of zero-value characters to implement this for all of Unicode (currently); implementations that support only a subset of Unicode need only a subset of the list, of course:
(define zeros '( #\x0030 ;DIGIT ZERO #\x0660 ;ARABIC-INDIC DIGIT ZERO #\x06F0 ;EXTENDED ARABIC-INDIC DIGIT ZERO #\x07C0 ;NKO DIGIT ZERO #\x0966 ;DEVANAGARI DIGIT ZERO #\x09E6 ;BENGALI DIGIT ZERO #\x0A66 ;GURMUKHI DIGIT ZERO #\x0AE6 ;GUJARATI DIGIT ZERO #\x0B66 ;ORIYA DIGIT ZERO #\x0BE6 ;TAMIL DIGIT ZERO #\x0C66 ;TELUGU DIGIT ZERO #\x0CE6 ;KANNADA DIGIT ZERO #\x0D66 ;MALAYALAM DIGIT ZERO #\x0E50 ;THAI DIGIT ZERO #\x0ED0 ;LAO DIGIT ZERO #\x0F20 ;TIBETAN DIGIT ZERO #\x1040 ;MYANMAR DIGIT ZERO #\x1090 ;MYANMAR SHAN DIGIT ZERO #\x17E0 ;KHMER DIGIT ZERO #\x1810 ;MONGOLIAN DIGIT ZERO #\x1946 ;LIMBU DIGIT ZERO #\x19D0 ;NEW TAI LUE DIGIT ZERO #\x1A80 ;TAI THAM HORA DIGIT ZERO #\x1A90 ;TAI THAM THAM DIGIT ZERO #\x1B50 ;BALINESE DIGIT ZERO #\x1BB0 ;SUNDANESE DIGIT ZERO #\x1C40 ;LEPCHA DIGIT ZERO #\x1C50 ;OL CHIKI DIGIT ZERO #\xA620 ;VAI DIGIT ZERO #\xA8D0 ;SAURASHTRA DIGIT ZERO #\xA900 ;KAYAH LI DIGIT ZERO #\xA9D0 ;JAVANESE DIGIT ZERO #\xAA50 ;CHAM DIGIT ZERO #\xABF0 ;MEETEI MAYEK DIGIT ZERO #\xFF10 ;FULLWIDTH DIGIT ZERO #\x104A0 ;OSMANYA DIGIT ZERO #\x11066 ;BRAHMI DIGIT ZERO #\x1D7CE ;MATHEMATICAL BOLD DIGIT ZERO #\x1D7D8 ;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO #\x1D7E2 ;MATHEMATICAL SANS-SERIF DIGIT ZERO #\x1D7EC ;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO #\x1D7F6 ;MATHEMATICAL MONOSPACE DIGIT ZERO )) (define (digit-value ch) (digit-value* ch zeros)) (define (digit-value* ch zeros) (if (null? zeros) #f (let* ((val (char->integer ch)) (val0 (char->integer (car zeros))) (val9 (+ val0 9))) (if (<= val0 val val9) (- val val0) (digit-value* ch (cdr zeros))))))CL provides this as digit-char-p, which is its substitute for char-numeric?.
WG1 accepted this proposal.
Being balloted as part of #452.
This is particularly important now that char-numeric? has been defined to return #t on any Unicode numeric digit.