Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
xuandao0708

[Yêu Cầu] Chuyển text từ số thành chữ

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

Hiện nay do nhu cầu thường xuyên phải chuyển từ số thành chữ nên nhờ mọi người có thể viết dùm lisp chuyển từ text số thành text chữ như trong hình cad dưới đây.

http://www.cadviet.com/upfiles/3/37805_mau.dwg

Thank mọi người 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

Mình cũng từng dùng bên Excel rồi nhưng mất nhiều công là phải ngồi cắt dán bạn ơi, là ít thì được, làm nhiều thì khó kiểm soát được lắm. Do có khi mình phài làm cả ngần ngàn cái nên dễ bị sai. Mong được sự giúp đỡ của mọi người. Cá mơn mọi người 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

Mình cũng hay dùng Add-in để chuyển từ số --> chữ lắm, mình thấy cách này cũng ổn.

Lúc trước cũng có ý định nhờ các sư huynh trên này viết dùm cho một cái lệnh có tác dụng đại khái như là:

Gõ tên lệnh --> Sau đó chọn đối tượng text (số) --> Kết quả (chữ).

Nhưng mà thấy hình như không khả quan mấy nên cũng không yêu cầu, và còn nữa là khi sử dụng CAD ít ai dùng đến thao tác này lắm, chỉ có những ai chuyên lập Dự Toán thì mới dùng nhì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

Nếu vậy thì chuyển từ text số sang text chữ là được phải không bạn? Nếu vậy thì chỉ cần chuyển từ text thành số sang thành text chữ thôi, mấy cái khác thì khỏi quan tâm bạn ơi như: 12,345.8 thành Mười hai ngàn ba trăm bốn mươi lăm phẩy tám là được rồi bạn ơi! Thank bạ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

Chắc bạn hiểu sai ý mình rồi. Mình chỉ nói là dùng Add-in chuyển thì được, chứ không nói là chuyển bằng Lisp của CAD.

Vì lúc trước mình cũng gặp trường hợp như bạn nhưng mà không giải quyết được, nên đành chọn cách làm thủ công là: Dùng Add-in bên Excel chuyển từ số -->chữ rồi sau đó chuyển sang CAD (cái này hơi mất thời gian, nhưng rất ok).

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

Mình cũng từng dùng bên Excel rồi nhưng mất nhiều công là phải ngồi cắt dán bạn ơi, là ít thì được, làm nhiều thì khó kiểm soát được lắm. Do có khi mình phài làm cả ngần ngàn cái nên dễ bị sai. Mong được sự giúp đỡ của mọi người. Cá mơn mọi người nhiều.

Hề hề hề,

Bạn xuandao0708 cũng đã có kinh nghiệm trong việc tham gia diễn đàn và việc làm lisp. Do bạn không nói rõ cái text số của bạn được cấu trúc theo kiểu gì mà chỉ nói chung chung như vầy, hơn nữa việc bắt lisp phải thể hiện tiếng Việt quả là một khó khăn không bé. vậy nên mình chỉ gợi ý bạn cách xử lý rồi tùy bạn lựa chọn giải pháp cho thỏa mãn ý thích của bạn nhé.

1/- Kiểm tra text xem có thuần số hay không.

2/- Kiểm tra vị trí dấu thập phân, lấy đó làm chuẩn tách số đã có thành các nhóm text ba chữ số một về phía trước và sau dấu phẩy.

3/- Đọc lần lượt các nhóm số này rồi tạo chuỗi nối các kết quả lại là Ok.

4/- Gửi bạn một khúc code nhap để đọc nhóm chỉ có 1 chữ số. Với cấu trúc tương tự bạn sẽ có code đọc nhóm có hai chữ số và ba chữ số. Lưu ý cách sử dụng hàm cond nữa là Ok.

hy vọng bạn sẽ làm được.


(defun docnhom ( txt / n t1)
(setq n (strlen txt))
(cond 
  ((= n 1) (setq t1 (atof txt)) (cond 
                                                       ((equal  t1 0 0.001) (setq doc "Khong"))
                                                       ((equal  t1 1 0.001) (setq doc "Mot"))
                                                       ((equal  t1 2 0.001) (setq doc "Hai"))
                                                       ((equal  t1 3 0.001) (setq doc "Ba"))
                                                       ((equal  t1 4 0.001) (setq doc "Bon"))
                                                       ((equal  t1 5 0.001) (setq doc "Nam"))
                                                       ((equal  t1 6 0.001) (setq doc "Sau"))
                                                       ((equal  t1 7 0.001) (setq doc "Bay"))
                                                       ((equal  t1 8 0.001) (setq doc "Tam"))
                                                       ((equal  t1 9 0.001) (setq doc "Chin"))
                                                       (T nil)
                                                    ))
  (T nil)
)
doc
)

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

Nếu vậy thì chuyển từ text số sang text chữ là được phải không bạn? Nếu vậy thì chỉ cần chuyển từ text thành số sang thành text chữ thôi, mấy cái khác thì khỏi quan tâm bạn ơi như: 12,345.8 thành Mười hai ngàn ba trăm bốn mươi lăm phẩy tám là được rồi bạn ơi! Thank bạn nhiều.

Để chỉn chu thì cũng k phải đơn giản, và nếu có thì chắc cũng k free :D

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

Để chỉn chu thì cũng k phải đơn giản, và nếu có thì chắc cũng k free :D

Hề hề hề,

Cái gọi là chỉn chu ấy do người dùng tự quyết thôi, còn mình mới nghĩ tòn teng được đến vậy.

Hề hề hề,...

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

Không phải đến nỗi bể não, nhưng bể… nồi cơm! Bởi vì nó còn kèm theo mấy thứ lằng nhằng nữa như: “Mươi”, “Lăm”, “Tư”, “Linh”…

Trên CV đã có lisp chuyển số nguyên dương, nhưng vẫn chưa ổn, mọi người tham khảo xem. Rất tiếc tôi quên tác giả, srr tác giả. Tôi cũng chỉ test vài trường hợp.

;; free lisp from cadviet.com
(setq
 donvi 	(list " nghin" " trieu" " ty")
 lstso 	(list
  	(cons "0" " khong")
  	(cons "1" " mot")
  	(cons "2" " hai")
  	(cons "3" " ba")
  	(cons "4" " bon")
  	(cons "5" " nam")
  	(cons "6" " sau")
  	(cons "7" " bay")
  	(cons "8" " tam")
  	(cons "9" " chin")
  	(cons "0" " muoi"))
 s_tram " tram"
 s_muoi " muoi"
 s_linh " linh"
 s_tu 	" tu"
 s_lam 	" lam")
(defun c:doctext ()
 (setq    ent (car (entsel "\nHay pick vao text so can doc: "))
   tt  (entget ent)
   gt  (cdr (assoc 1 tt))
   ok  t
   lst (mapcar '(lambda (x)
  			(if (or (> x 57) (< x 48))
    		(setq ok nil)))
       	(vl-string->list gt)))
 (if ok
(progn
 	(setq
   p  (getpoint "\nPick toa do cua text moi: ")
   tt (subst (cons 1 (substr (docso gt) 2)) (cons 1 gt) tt)
   tt (subst (cons 10 p) (assoc 10 tt) tt))
 	(entmake tt))
(alert "\nText vua chon khong phai la so nguyen duong")))
(defun docso (str)
 (defun doc1 (so)
(cdr (assoc so lstso)))
 (defun doc3 (a b c)
(if    (= a "0")
 	(setq a1 "")
 	(setq a1 (strcat (doc1 a) s_tram)))
(if    (= b "0")
 	(if (/= a "0")
   (setq b1 s_linh)
   (setq b1 ""))
 	(if (= b "1")
   (setq b1 s_muoi)
   (setq b1 (strcat (doc1 B ) s_muoi))))
(setq c1
  	(cond
	((= c "0") "")
	((and (= c "4") (/= b "1")) s_tu)
	((and (= c "5") (/= b "0")) s_lam)
	(t (doc1 c))))
(strcat a1 b1 c1))
 (setq    lstchar 	(reverse (mapcar 'chr (vl-string->list str)))
   len 	(length lstchar)
   dvht 	0
   kq 	""
   strdonvi "")
 (while (>= (length lstchar) 3)
(setq
 	kqht 	(strcat
		(doc3 (nth 2 lstchar) (nth 1 lstchar) (nth 0 lstchar)))
 	kq   	(strcat kqht strdonvi kq)
 	lstchar  (cdddr lstchar)
 	dvht 	(if (= dvht 2)
		0
		(1+ dvht))
 	strdonvi (nth dvht donvi)))
 (if (/= (length lstchar) 0)
(progn
 	(while (< (length lstchar) 3)
   (setq lstchar (append lstchar (list "0"))))
 	(setq kqht (strcat
  		(doc3 (nth 2 lstchar) (nth 1 lstchar) (nth 0 lstchar)))
   	kq 	(strcat kqht (nth dvht donvi) kq))))
 kq)

  • 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

Hix, các mơn bác PhamThanhBinh và ketxu nhiều, mình có tham gia diễn dàn cad việt 1 thời gian nhưng mình hoàn toàn không biết chút gì về lisp cả, mong mọi người thông cảm. trong file cad của mình gởi lên thì text đó luôn là số vậy thì không cần kiểm tra nữa. Còn cấu trúc text số của mình luôn là xxx,xxx,xxx.x . Theo mình nghĩ thì những gợi ý như của Bác PhamThanhBinh là ok lắm rồi. Mong mọi người có thể viết dùm mình lisp này. Thank mọi người 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

Không phải đến nỗi bể não, nhưng bể… nồi cơm! Bởi vì nó còn kèm theo mấy thứ lằng nhằng nữa như: “Mươi”, “Lăm”, “Tư”, “Linh”…

Trên CV đã có lisp chuyển số nguyên dương, nhưng vẫn chưa ổn, mọi người tham khảo xem. Rất tiếc tôi quên tác giả, srr tác giả. Tôi cũng chỉ test vài trường hợp.

E nhớ k nhầm nó thuộc 1 topic đã bị xóa - bác Hoành viết.

Ngoài ra còn vấn đề format bảng mã text, "mốt"...

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

Em text thử rồi, có vấn đề như sau:

Ví dụ

số 3: kết quả là "ba nghin".

số 153682: kết quả : "mot tram nam muoi trieu sau tram tam muoi hai".

Cái này có thể sửa được không.

Mà còn nữa, có tiếng Việt luôn thì ngon quá...

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

Mong được mọi người giúp đỡ! Thank mọi người nhiều.

Hôm qua, anh gia_bach có post bài này :

http://www.cadviet.com/forum/index.php?showtopic=61667&pid=188564&st=0&&do=findComment&comment=188564

Bạn xem thử

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

Mình thử viết cái lisp theo như đầu bài là file bạn gửi lên, xem thế nào nhé.

Tuy nhiên vì lười nên mình chỉ viết cho lisp đọc đế hàng triệu thôi, còn hàng tỉ thì có thể thêm sau nếu thật cần thiết :)

(defun c:doc(/ docsotrieu docsonghin docsodonvi nd stt nguyen thapphan)
 (setq text (entget(car(entsel)))
nd (cdr(assoc 1 text))
stt (vl-string-search "," nd)
nguyen (vl-string-subst "" "."(substr nd 1 stt))
thapphan(dichso (substr nd (+ stt 2)))
)
 (cond ((>(strlen nguyen)6)
 (setq sotrieu (substr nguyen 1 (- (strlen nguyen) 6))
   	docsotrieu (strcat (doc3so sotrieu) " tri\U+1EC7u ")
   	songhin (substr nguyen (- (strlen nguyen) 5) 3)
   	docsonghin (strcat (doc3so songhin) " ngh\U+00ECn ")
   	sodonvi (substr nguyen (- (strlen nguyen) 2) 3)
   	docsodonvi (doc3so sodonvi)
   	)
 (strcat docsotrieu docsonghin docsodonvi " ph\U+1EA9y " thapphan)
 );tri\U+1EC7u
((and(<=(strlen nguyen)6) (>(strlen nguyen)3))
 (setq songhin (substr nguyen 1 (- (strlen nguyen) 3))      
   	docsonghin (strcat (doc3so songhin) " ngh\U+00ECn ")
   	sodonvi (substr nguyen (- (strlen nguyen) 2) 3)
   	docsodonvi (doc3so sodonvi)
   	)
 (strcat docsonghin docsodonvi " ph\U+1EA9y "  thapphan)
 );ngh\U+00ECn
((<=(strlen nguyen)3)
 (setq
   	sodonvi nguyen
   	docsodonvi (doc3so sodonvi)
   	)
 (strcat docsodonvi " ph\U+1EA9y " thapphan)
 );ngh\U+00ECn  
)

 )
;;;=======================================
(defun dichso(so / so docso)

 (cond ((= so "0")
 (setq docso "không")
 )
((= so "1")
 (setq docso "m\U+1ED9t")
 )
((= so "2")
 (setq docso "hai")
 )
((= so "3")
 (setq docso "ba")
 )
((= so "4")
 (setq docso "b\U+1ED1n")
 )
((= so "5")
 (setq docso "n\U+0103m")
 )
 ((= so "6")
  (setq docso "s\U+00E1u")
 )
 ((= so "7")
  (setq docso "b\U+1EA3y")
 )
 ((= so "8")
  (setq docso "t\U+00E1m")
 )
 ((= so "9")
  (setq docso "ch\U+00EDn")
  )
)
 )
;;;;
(defun doc3so(sodonvi)
 (cond
((=(strlen sodonvi)3);;co 3 so
(setq tram (strcat(dichso (substr sodonvi 1 1)) " tr\U+0103m "));hang tr\U+0103m  
(cond ((and(/=(substr sodonvi 2 1) "0") (/=(substr sodonvi 2 1) "1"))
(setq chuc (strcat(dichso (substr sodonvi 2 1)) " m\U+01B0\U+01A1i "))
)
((=(substr sodonvi 2 1) "0")
(setq chuc "linh ")
)
((=(substr sodonvi 2 1) "1")
(setq chuc "m\U+01B0\U+1EDDi ")
)
);hang chuc
(cond ((and(/=(substr sodonvi 3 1) "0")  (/=(substr sodonvi 3 1) "1") (/=(substr sodonvi 3 1) "5"))
(setq donvi (dichso (substr sodonvi 3 1)))
)
((=(substr sodonvi 3 1) "0")
(setq donvi "")
)
((and(/= chuc "m\U+01B0\U+1EDDi ") (/= chuc "linh ") (=(substr sodonvi 3 1) "1"))
(setq donvi "m\U+1ED1t")
)
((and(= chuc "m\U+01B0\U+1EDDi ") (=(substr sodonvi 3 1) "1"))
(setq donvi "m\U+1ED9t")
)
((and(= chuc "linh ") (=(substr sodonvi 3 1) "1"))
(setq donvi "m\U+1ED9t")
)
((=(substr sodonvi 3 1) "5")
(setq donvi "l\U+0103m")
)
);hang don vi  
(strcat tram chuc donvi)
);; co 3 so

((=(strlen sodonvi)2);;co 2 so    
(cond ((/=(substr sodonvi 1 1) "1")
(setq chuc (strcat(dichso (substr sodonvi 1 1)) " m\U+01B0\U+01A1i "))
);hang chu
((=(substr sodonvi 1 1) "1")
(setq chuc "m\U+01B0\U+1EDDi ")
)
);hang chuc
(cond ((and(/=(substr sodonvi 2 1) "0")  (/=(substr sodonvi 2 1) "1") (/=(substr sodonvi 2 1) "5"))
(setq donvi (dichso (substr sodonvi 2 1)))
)
((=(substr sodonvi 2 1) "0")
(setq donvi "")
)
((and(/= chuc "m\U+01B0\U+1EDDi ") (=(substr sodonvi 2 1) "1"))
(setq donvi "m\U+1ED1t")
)
((and(= chuc "m\U+01B0\U+1EDDi ") (=(substr sodonvi 2 1) "1"))
(setq donvi "m\U+1ED9t")
)
((=(substr sodonvi 2 1) "5")
(setq donvi "l\U+0103m")
)
);hang don vi  

(strcat chuc donvi)
);; co 2 so
((=(strlen sodonvi)1)
(setq donvi (dichso (substr sodonvi 1 1)))        
);; co 1 so
)  
 )  

  • 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  

×