Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
dgqcc

Tách chuỗi trong lisp

Các bài được khuyến nghị

Có 2 loại chuỗi:

abcx (abc cố định biết trước, x là số nguyên cần lấy)

dyz (d cố định biết trước, yz là số nguyên cần lấy)

Nhờ các bác viết giùm một đoạn code:

- Nếu gặp chuỗi abcx thì gán biến num = x

- Nếu gặp chuỗi dyz thì gán biến num = yz

Biến num mang giá trị số nguyên.

Ví dụ 2 chuỗi đó là: abc1; abc2 ... d10; d11 ...

Mong sự giúp đỡ của các bác.

Xin cảm ơn nhiều!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Có 2 loại chuỗi:

abcx (abc cố định biết trước, x là số nguyên cần lấy)

dyz (d cố định biết trước, yz là số nguyên cần lấy)

Nhờ các bác viết giùm một đoạn code:

- Nếu gặp chuỗi abcx thì gán biến num = x

- Nếu gặp chuỗi dyz thì gán biến num = yz

Biến num mang giá trị số nguyên.

Ví dụ 2 chuỗi đó là: abc1; abc2 ... d10; d11 ...

Mong sự giúp đỡ của các bác.

Xin cảm ơn nhiều!

Bạn dùng thử đoạn LISP này :

Hàm tách 1 chuỗi : trả về số nguyên (nếu thành công) với chuỗi định dạng cho trước.

(str_left_truncate "abc123" "abc") -> 123

(str_left_truncate "abc123.0" "abc") -> nil : 123.0 là số thực

(str_left_truncate "abc1 000" "abc") -> nil : 1 000 không phải là kiểu số

(defun str_left_truncate (str prefix / prefix_length str_pre str_suf num)
 (setq	prefix_length (strlen prefix)
str_pre	      (substr str 1 prefix_length)
 )
 (if (= str_pre prefix)
   (progn
     (setq str_suf (substr str (+ 1 prefix_length)))
     (if (IsInteger str_suf)
(setq num (atoi str_suf))
     )
   )
 )
)

(defun IsInteger (str)
 (if (not(vl-string-search " " str))
   (if (= (type (read str)) 'INT )
     T
     nil
     )
   nil
   )
 )

 

Minh họa : (nhớ copy các hàm phía trên)

(defun C:TachChuoi(/ str ss lst str_int ent nd num )
 (setq str (getstring "Nhap chuoi dinh dang:"))
 (princ "\nChon text:")
 (setq ss (ssget (list (cons 0 "TEXT")))
lst (ss2ent ss)
str_int "")
 (repeat (length lst)
   (setq ent (entget (car lst))
  lst (cdr lst)
  nd (cdr (assoc 1 ent)) )
   (if (setq num (str_left_truncate nd str))
     (setq str_int (strcat (itoa num) " " str_int) )
     )
   ); repeat
 (if (/= str_int "")(alert (strcat "Cac so nguyen : " str_int) ))
 (princ)
 )

(defun ss2ent (ss / sodt index lstent)
 (setq sodt (if ss (sslength ss) 0)
index 0
)
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
  )
   )
 (reverse lstent)
)

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn gia_bach nhiều!

Nhưng tôi có vấn đề là các chuỗi đó do ta chọn trên màn hình; và có 2 loại chuỗi như trên ( abc1; abc2; ... ; d10; d11; d12...)

làm sao khi chọn các chuỗi đó thì biến num chứa các giá trị là 1; 2 ...; 11; 12... Mục đích là tôi lấy các giá trị đó để tính toán.

Ví dụ thế này:

- Chọn danh sách các chuỗi.

- lấy các giá trị số nguyên vào biến num

- Tính 1 biểu thức nào đó VD: tong (* 2500 num)

- Tương ứng với mỗi chuỗi ta có 1 kết quả. ghi ra màn hình tất cả các giá trị của biến tong với 1 điểm cho trước

Mong sự giúp đỡ của các bác!

Xin cảm ơn nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn gia_bach nhiều!

Nhưng tôi có vấn đề là các chuỗi đó do ta chọn trên màn hình; và có 2 loại chuỗi như trên ( abc1; abc2; ... ; d10; d11; d12...)

làm sao khi chọn các chuỗi đó thì biến num chứa các giá trị là 1; 2 ...; 11; 12... Mục đích là tôi lấy các giá trị đó để tính toán.

Ví dụ thế này:

- Chọn danh sách các chuỗi.

- lấy các giá trị số nguyên vào biến num

- Tính 1 biểu thức nào đó VD: tong (* 2500 num)

- Tương ứng với mỗi chuỗi ta có 1 kết quả. ghi ra màn hình tất cả các giá trị của biến tong với 1 điểm cho trước

Mong sự giúp đỡ của các bác!

Xin cảm ơn nhiều.

 

(defun C:TachChuoi(/ str ss lst str_int ent nd num )

............................

(if (setq num (str_left_truncate nd str))

.............

)

Giá trị num của bạn đây.

Bạn tùy nghi xử lý .

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hàm vl-string-search để tìm vị trí của "=" trong st

Hàm substr lấy chuỗi con của st bắt đầu từ vị trí mà hàm vl-string-search trả về (+ thêm 2 để loại bỏ dấu =)

Hàm atof để chuyển chuổi thành số.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ý của bạn giaovanthong là lấy 2 ký tự cuối, không biết 2 ký tự đó là gì, chứ nếu biết là m2 thì cần gì lấy  :)  :)

Bạn lấy 2 ký tự cuối = (substr st (- (strlen st) 1)) 

strlen là hàm lấy số ký tự của chuỗi. Bạn để ý là -1 chứ kp -2.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×