顺便说一句,我仍然认为NumbersFromString子函数应该这样写:
- ;_$ (mapcar 'cadr
- ; (vl-sort
- ; (vl-remove 'nil
- ; (mapcar '(lambda (x / n) (if (setq n (NumberFromString x T)) (list n x) (list 0 x)) )
- ; '("A1B" "ABC" "A17" "AB14.5B.C" "DEF" "A1.5B" "A16.BC")
- ; )
- ; )
- ; '(lambda (a b) (< (car a) (car b)))
- ; )
- ; )
- ; -> ("ABC" "DEF" "A1B" "A1.5B" "AB14.5B.C" "A16.BC" "A17")
- ; _$ (NumberFromString "12345" nil) -> 12345
- ; _$ (NumberFromString "12345" T) -> 12345
- ; _$ (NumberFromString "A.B.C,D,E" nil) -> nil
- ; _$ (NumberFromString "A.B.C,D,E" T) -> nil
- ; _$ (NumberFromString "A1.B2.C3,D4,E5" nil) -> 12345
- ; _$ (NumberFromString "A1.B2.C3,D4,E5" T) -> 1.2345
- (defun NumberFromString ( s RetainFirstDot )
- (cond
- ( (not (eq 'STR (type s))) )
- ( (not (vl-some (function (lambda (x) (< 47 x 58))) (vl-string->list s))) (setq s nil) )
- (RetainFirstDot
- (setq s (vl-list->string (vl-remove-if-not (function (lambda (x) (or (= x 46) (< 47 x 58)))) (vl-string->list s))))
- (while (or (= "" s) (and (vl-some (function (lambda (x) (< 47 x 58))) (vl-string->list s)) (not (numberp (read s))))) ; attempt to retain the very first dot, but can return ".."
- (setq s (vl-list->string (reverse (vl-string->list (vl-string-subst "" "." (apply 'strcat (reverse (mapcar 'chr (vl-string->list s)))))))))
- ); while
- ); RetainFirstDot
- ( (setq s (vl-list->string (vl-remove-if-not (function (lambda (x) (< 47 x 58))) (vl-string->list s)))) )
- ); cond
- (cond ((not s) s) ((vl-every '(lambda (x) (= x 46)) (vl-string->list s)) nil)((= "" s) nil) (s (read s)))
- ); defun NumberFromString
如果它具有字母数字字符串排序目的,则至少是这样。 |