This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.

Ticket 220: New DIGIT-VALUE procedure

2012-07-15 01:43:38
WG1 - Core
cowan
major
cowan
duplicate
source
closed
2011-06-17 09:22:20
defect

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) => 0

You 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?.

This is particularly important now that char-numeric? has been defined to return #t on any Unicode numeric digit.

resolution
statusnewdecided

WG1 accepted this proposal.

owneralexshinncowan
statusdecidedwriting
descriptionThis 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) => 0 }}} You 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 (and (<= val0 val) (<= val val9)) (- val val0) (digit-value* ch (cdr zeros)))))) }}} CL provides this as `digit-char-p`, which is its substitute for `char-numeric?`.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) => 0 }}} You 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?`.
resolutionfixed
statuswritingclosed
resolutionfixed
statusclosedreopened
resolutionduplicate
statusreopenedclosed

Being balloted as part of #452.