(defun PageNumbers->String (PageNumberList / Num str LowNumber HighNumber LastNumber Difference PartialStr)
;Returns string representing page numbers in list
(setq LowNumber (car PageNumberList)
LastNumber LowNumber
str (rtos LowNumber 2 0)
)
(foreach Num (cdr PageNumberList)
(if (or (= LowNumber nil) (= LastNumber nil))
(progn
(setq LowNumber Num
LastNumber LowNumber
)
)
)
(setq Difference (- Num LastNumber)
LastNumber Num
);setq
(if (< Difference 0)
(setq Difference (* Difference -1))
);if
(if (<= Difference 1)
(progn
(setq HighNumber Num
LastNumber HighNumber
)
)
(progn
(if (not HighNumber)
(progn
(if (not str)
(setq str (strcat (rtos LowNumber 2 0)))
(setq str (strcat str ", " (rtos LowNumber 2 0)))
)
(setq LowNumber Num
LastNumber LowNumber
)
)
(progn
(if (not str)
(setq str (strcat (rtos HighNumber 2 0)))
(setq str (strcat str "-" (rtos HighNumber 2 0)))
)
(setq LowNumber nil
HighNumber nil
LastNumber nil
)
)
)
)
);if
)
str
)
(defun PageNumbers->String (PageNumberList / Numbers LastNumber Difference str LowNumber)
;This routine returns page numbers in a formatted list, i.e. 1-6, 10-12, 13, 15
; Sort List
(defun JR:Sort (lst func)
;Code from derryck - https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/sort-list-rational-numbers/m-p/9366406/highlight/true#M396997
(mapcar '(lambda (x) (nth x lst)) (vl-sort-i lst func))
)
(setq Numbers (JR:Sort PageNumberList '<))
(princ Numbers)
(foreach Num Numbers
(if (not LowNumber)
(if (not LastNumber)
(progn
(setq LowNumber Num
LastNumber LowNumber
);setq
)
(progn
(setq LowNumber LastNumber)
)
)
);if
(if (not LastNumber)
(setq LastNumber Num)
(progn
(setq Difference (- Num LastNumber))
(if (or (> Difference 1) (= Num (last Numbers)))
(progn
(if (= Num (last Numbers))
(progn
(if (= str nil)
(progn
(if (/= LowNumber Num)
(setq str (strcat (rtos LowNumber 2 0) "-" (rtos Num 2 0)))
(setq str (rtos Num 2 0))
);if
);progn
(progn
(if (/= LowNumber Num)
(setq str (strcat str ", " (rtos LowNumber 2 0) "-" (rtos Num 2 0)))
(setq str (strcat str ", " (rtos Num 2 0)))
);if
);progn
);if
);progn
(progn
(if (= str nil)
(progn
(if (/= LowNumber Num)
(setq str (strcat (rtos LowNumber 2 0) "-" (rtos LastNumber 2 0)))
(setq str (rtos Num 2 0))
);if
);progn
(progn
(if (/= LowNumber Num)
(setq str (strcat str ", " (rtos LowNumber 2 0) "-" (rtos LastNumber 2 0)))
(setq str (strcat str ", " (rtos Num 2 0)))
);if
);progn
);if
);progn
);if
(setq LowNumber nil)
);progn
);if
);progn
);if
(setq LastNumber Num)
);foreach
str
);defun
(defun PN2S (lst / n i a l rng shtlst)
(setq lst (vl-sort lst '<))
(while (/= lst nil)
(setq a nil)
(setq i 1)
(setq n (car lst))
(while (= a nil)
(if (and (> (length lst) 1) (= n (- (cadr lst) i)))
(progn
(setq l (cadr lst))
(setq lst (vl-remove (nth 1 lst) lst))
(setq i (1+ i))
)
(progn
(setq a "stop")
(if (< n l)
(setq rng (strcat (rtos n 2 0) "-" (rtos l 2 0)))
(setq rng (strcat (rtos n 2 0)))
)
(setq shtlst (cons rng shtlst))
(setq lst (vl-remove (nth 0 lst) lst))
)
)
)
)
(setq shtlst (reverse shtlst))
(l2s "," shtlst)
)
(defun l2s (delim lst / out)
(setq out (car lst) lst (cdr lst))
(repeat (length lst)
(setq out (strcat out delim (car lst)) lst (cdr lst))
)
out
)
Did it a little bit different. Doesn't work 100% like yours with the last example. need to tweak the logic a bit.
(P#2S '(1 2 3 4 5 6 11 13 14 15 16 17 18 19 20 21 22 23))
"1-6,11,13-23"
(P#2S '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23))
"1-23"
(P#2S '(1 3 5 6))
"1,3,5-6"
Similar to that already posted -But yours is so much more concise at 18 lines vs my 70 or so.....lolCode - Auto/Visual Lisp: [Select]
Here's one for the reverse -Code - Auto/Visual Lisp: [Select]
(cond ( (= "" r) nil) ) ) ) ) ) )Code - Auto/Visual Lisp: [Select]
_$ (rng->lst "1-23") (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23) _$ (rng->lst "1-6,11,13-23") (1 2 3 4 5 6 11 13 14 15 16 17 18 19 20 21 22 23) _$ (rng->lst "1,3,5-6") (1 3 5 6)
(defun String->NumberList (NumberString / str pos LeftString RightString Results Start End)
(defun LM:str->lst ( str del / pos )
;; String to List - Lee Mac
;; Separates a string using a given delimiter
;; str - [str] String to process
;; del - [str] Delimiter by which to separate the string
;; Returns: [lst] List of strings
(if (setq pos (vl-string-search del str))
(cons (substr str 1 pos) (LM:str->lst (substr str (+ pos 1 (strlen del))) del))
(list str)
)
)
(setq StringList (LM:str->lst NumberString ","))
(foreach str StringList
(setq str (vl-string-trim " " str)
pos (vl-string-search "-" str)
)
(if (not pos)
(progn
(if (not Results)
(setq Results (list (atoi str)))
(setq Results (append Results (list (atoi str))))
)
)
(progn
(setq LeftString (substr str 1 pos)
RightString (substr str (+ pos 2))
Start (atoi LeftString)
End (atoi RightString)
)
(if (not Results)
(progn
(setq Results (list Start)
Start (+ Start 1)
)
)
)
(while (<= Start End)
(setq Results (append Results (list Start))
Start (+ Start 1)
)
)
)
)
)
Results
)
This is why i come to the forums almost daily. Always learning, picked up several things thank you Lee.Yeah, there I times I think Lee should be on the payroll here.....LOL
I am not entirely sure what the issues is here, but a string of: 1,3,5,7-10,12-15
Returns:
(1 3 5 7 8 9 10 2 3 4 5 6 7 8 9 10 11 12 13 14 15)
I am confused, I got an email saying the Lee had responded, but I don't see his response here.
This is why i come to the forums almost daily. Always learning, picked up several things thank you Lee.