| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > {Конкурс} Lisp. Пребразование в число при возможности

{Конкурс} Lisp. Пребразование в число при возможности

Ответ
Поиск в этой теме
Непрочитано 25.12.2010, 23:14 #1
{Конкурс} Lisp. Пребразование в число при возможности
back1981
 
Регистрация: 23.07.2009
Сообщений: 29

Есть список, например '("Сторока" "1" "2" "2-2"),
как можно на выходе получить '("Сторока" 1 2 "2-2"). Применять type->atoi не вышло так как для всех элементов он вернет str. Просто atoi - ошибка на строке получится. Намекните на возможные выходы.
Просмотров: 4575
 
Непрочитано 25.12.2010, 23:44
#2
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Если в списке только строки, то вот:
Код:
[Выделить все]
(mapcar '(lambda (s) (if (= (itoa (atoi s)) s) (atoi s) s))
  '("Строка" "1" "2" "2-2")
)
Li6-D вне форума  
 
Автор темы   Непрочитано 26.12.2010, 00:07
#3
back1981


 
Регистрация: 23.07.2009
Сообщений: 29


Спасибо, то, что надо
back1981 вне форума  
 
Автор темы   Непрочитано 27.12.2010, 18:07
#4
back1981


 
Регистрация: 23.07.2009
Сообщений: 29


Все хорошо только, когда элемент вещественное число, то это уже работает неправильно, и многое зависит от системной переменной DIMZIN, которая кстати разная, если надо работать с числом "0.6" или "1.0", соответственно 4 и 8.
back1981 вне форума  
 
Непрочитано 27.12.2010, 21:17
#5
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Поначалу показалось, что нужна выборка только по целым числам.
Код:
[Выделить все]
(mapcar '(lambda (a) (if (member (type (read a)) '(INT REAL)) (read a) a))
  '("Строка" "1" "2" "2.7" "2-2" "Pi" "1E3" "1.234E")
)

Возвращает:
("Строка" 1 2 2.7 "2-2" "Pi" 1000.0 "1.234E")
Добавлено 29.12.10: Вот написал на скорую руку, а потом заметил и прочитал у Полещука и Лоскутова про капризы функции read при работах со строками такого содержания: "7..7", " .323", "\"", "'". То определяется не число, а символ или возникает ошибка. В общем read надо применять для специально сформированных строк, а не произвольных - очень много нюансов

Последний раз редактировалось Li6-D, 29.12.2010 в 22:36. Причина: Добавил самокритики
Li6-D вне форума  
 
Непрочитано 27.12.2010, 21:57
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


А если так?
Код:
[Выделить все]
(defun test (lst)
  (mapcar
    (function
      (lambda (x)
        (cond
          ((and (= (type x) 'str)
                (eval (read (vl-string-subst "." "," x)))
                ) ;_ end of and
           (eval (read (vl-string-subst "." "," x)))
           )
          (t x)
          ) ;_ end of cond
        ) ;_ end of lambda
      ) ;_ end of function
    lst
    ) ;_ end of mapcar
  ) ;_ end of defun
Проверка:
Код:
[Выделить все]
_$ (setq a '("Строка" "1" "2" "2.7" "2-2" "Pi" "1E3" "1.234E2"))
("Строка" "1" "2" "2.7" "2-2" "Pi" "1E3" "1.234E2")
_$ (test a)
("Строка" 1 2 2.7 "2-2" 3.14159 1000.0 123.4)
_$ (setq a '("Строка" "1" "2" "2.7" "2-2" "Pi" "1E3" "1.234E"))
("Строка" "1" "2" "2.7" "2-2" "Pi" "1E3" "1.234E")
_$ (test a)
("Строка" 1 2 2.7 "2-2" 3.14159 1000.0 "1.234E")
_$ (setq a '("Строка" "1" "2" "2,7" "2-2" "Pi" "1E3" "1.234E"))
("Строка" "1" "2" "2,7" "2-2" "Pi" "1E3" "1.234E")
_$ (test a)
("Строка" 1 2 2.7 "2-2" 3.14159 1000.0 "1.234E")
_$ (setq a '("Строка" 1 2 3.65 "2,7" "2-2" "Pi" "1E3" "1.234E"))
("Строка" 1 2 3.65 "2,7" "2-2" "Pi" "1E3" "1.234E")
_$ (test a)
("Строка" 1 2 3.65 2.7 "2-2" 3.14159 1000.0 "1.234E")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.12.2010, 22:24
#7
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


Алексей, насколько я понял у back1981 в исходном списке только строковые константы (наверное какая-то ssget-выборка текстов из чертежа), то есть там числа не встречаются, а только их строковые представления.
В тоже время, в списке может встретиться такой текст "(лом в пилораму)". Как его обработает test?
Li6-D вне форума  
 
Непрочитано 27.12.2010, 22:31
#8
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Li6-D, усовершенствовать можно до бесконечности
Код:
[Выделить все]
(defun test (lst / res)
  (mapcar
    (function
      (lambda (x)
        (cond
          ((and (= (type x) 'str)
                (not (vl-catch-all-error-p
                       (setq res
                              (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (eval (read (vl-string-subst "." "," x)))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                             ) ;_ end of setq
                       ) ;_ end of vl-catch-all-error-p
                     ) ;_ end of not
                res
                ) ;_ end of and
           res
           )
          (t x)
          ) ;_ end of cond
        ) ;_ end of lambda
      ) ;_ end of function
    lst
    ) ;_ end of mapcar
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.12.2010, 10:12
#9
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Кулик Алексей aka kpblc, раз усовершенствовать можно до бесконечности, то предлагаю такой вариант
Код:
[Выделить все]
; Проверка является ли строка числом (если not_null = T - проверка на неравенство нулю; если int = T - проверка является ли число целым)
(defun Is-Str->Value(str not_null int / lst lst_memb)
  (if (= (substr str 1 1) "-")
    (setq str (substr str 2))
  )
  (setq lst (vl-string->list (vl-string-translate ",e" ".E" str)))
  (if int
    (setq lst_memb (list 45 48 49 50 51 52 53 54 55 56 57 69))
    (setq lst_memb (list 45 46 48 49 50 51 52 53 54 55 56 57 69))
  )
  (if (and (vl-every '(lambda(x) (member x lst_memb)) lst)
           (< (length (vl-remove-if-not '(lambda(x) (= x 46)) lst)) 2)
	   (if (vl-position 69 lst)
	     (and (> (vl-position 69 lst) 0)
		  (< (vl-position 69 lst) (1- (length lst)))
		  (< (length (vl-remove-if-not '(lambda(x) (= x 69)) lst)) 2)
		  )
	     T
	     )
           (if (vl-position 45 lst)
             (and (< (length (vl-remove-if-not '(lambda(x) (= x 45)) lst)) 2)
                  (< (vl-position 45 lst) (1- (length lst)))
                  (= (nth (1- (vl-position 45 lst)) lst) 69)
                  )
             T
             )
           )
    (if not_null
      (> (length (vl-remove-if '(lambda(x) (or (= x 45) (= x 46) (= x 48) (= x 69))) lst)) 0)
      T
      )
    nil
  )
); End Is-Str->Value


_$ (mapcar '(lambda(x) (if (Is-Str->Value x nil nil)
                      (if (Is-Str->Value x nil T)
                        (fix (atof (vl-string-translate "," "." x)))
                        (atof (vl-string-translate "," "." x))
                        )
                      x
                      )
           )
        (list "Строка" "7 опять строка" "34.56" "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2")
        )
Возвращает:
("Строка" "7 опять строка" 34.56 45.23 "E34" 10000 "-3.56-E" -0.0356)
Алексей и Li6-D, ваши варианты
Код:
[Выделить все]
_$ (test (list "Строка" "7 опять строка" "34.56" "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2"))
("Строка" 7 34.56 45.23 "E34" 10000.0 "-3.56-E" -0.0356)
"1e4" вроде как тоже целое число
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 28.12.2010, 10:32
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


И от меня пару вариантов
Код:
[Выделить все]
(defun Str->Num1 (lst)
;;; lst - список строк
;;;Use (Str->Num1 '("Строка" "1" "2" "2-2"))
  (vl-load-com)
  (defun IsAllCharNumeric (str)
    (apply
      'and
      (mapcar '(lambda (x)
		 (vl-position
		   x
		   '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0" ".")
		 )
	       )
	      (mapcar 'chr
		      (vl-string->list (vl-string-trim "%UuoO \t" str))
	      )
      )
    )
  )
  (mapcar '(lambda (x)
	     (if (IsAllCharNumeric x)
	       (atof x)
	       x
	     )
	   )
	  lst
  )
)

(defun Str->Num2 (lst)
;;; lst - список строк
;;;Use (Str->Num2 '("Строка" "1" "2" "2-2"))
  (mapcar '(lambda (s / x)
	     (if (wcmatch (rtos (setq x (atof s)) 2 15) (strcat s "*"))
	       x
	       s
	     )
	   )
	  lst
  )
)
(defun Str->Num3 (lst)
;;;Вариант Str->Num1 Переводит целые - в целые. Вещественные - в вещественные
;;; lst - список строк
;;;Use (Str->Num3 '("Строка" "1" "2.2" "2-2"))
  (vl-load-com)
  (defun IsAllCharNumeric (str)
    (apply
      'and
      (mapcar '(lambda (x)
		 (vl-position
		   x
		   '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0" ".")
		 )
	       )
	      (mapcar 'chr
		      (vl-string->list (vl-string-trim "%UuoO \t" str))
	      )
      )
    )
  )
  (mapcar '(lambda (x)
	     (if (IsAllCharNumeric x)
	       (if (vl-string-search "." x)
		 (atof x)
		 (atoi x)
	       )
	       x
	     )
	   )
	  lst
  )
)
На примере TararykovDG,
Код:
[Выделить все]
(Str->Num1 (list "Строка" "7 опять строка" "34.56" "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2"))
;_("Строка" "7 опять строка" 34.56 "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2") 
(Str->Num2 (list "Строка" "7 опять строка" "34.56" "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2"))
;_("Строка" "7 опять строка" 34.56 "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2") 
(Str->Num3 (list "Строка" "7 опять строка" "34.56" "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2"))
;_("Строка" "7 опять строка" 34.56 "45,23" "E34" "1e4" "-3.56-E" "-3.56E-2")
Str->Num3 переводит целые в целые, вещественные в вещественные
PS строки типа "1e4" не обрабатывает
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 28.12.2010, 11:07
#11
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Код:
[Выделить все]
; Преобразует в число или в nil
(defun conv-to-value(param / str lst param_is_value)
  (setq str (vl-princ-to-string param))
  (if (= (substr str 1 1) "-")
    (setq str (substr str 2))
  )
  (setq lst (vl-string->list (vl-string-translate ",e" ".E" str)))
  (if (and (vl-every '(lambda(x) (member x (list 45 46 48 49 50 51 52 53 54 55 56 57 69))) lst)
           (< (length (vl-remove-if-not '(lambda(x) (= x 46)) lst)) 2)
	   (if (vl-position 69 lst)
	     (if (and (> (vl-position 69 lst) 0)
		      (< (vl-position 69 lst) (1- (length lst)))
		      (< (length (vl-remove-if-not '(lambda(x) (= x 69)) lst)) 2)
                      (if (vl-position 46 lst)
                        (< (vl-position 46 lst) (vl-position 69 lst))
                        T
                        )
		      )
               (setq param_is_value T)
               )
	     (setq param_is_value T)
	     )
           (if (vl-position 45 lst)
             (if (and (< (length (vl-remove-if-not '(lambda(x) (= x 45)) lst)) 2)
                      (< (vl-position 45 lst) (1- (length lst)))
                      (= (nth (1- (vl-position 45 lst)) lst) 69)
                      )
               (setq param_is_value T)
               )
             (setq param_is_value T)
             )
           )
    (setq param_is_value T)
  )
  (if param_is_value
    (if (or (vl-position 46 lst) (and (vl-position 69 lst) (= (nth (1+ (vl-position 69 lst)) lst) 45)))
      (atof (vl-string-translate "," "." (vl-princ-to-string param)))
      (fix (atof (vl-string-translate "," "." (vl-princ-to-string param))))
      )
    nil
    )
  ); end conv-to-value


Пример:
_$ (setq test_lst (list "Обычная строка" pi list 'Вася "1e4" "-34,56e-2" "45 строка" "45,23" "12,32.43" if "E45-" (list "sd" 34) "23.43-E" "178,23e-2"))
("Обычная строка" 3.14159 #<SUBR @0fabdda8 LIST> ВАСЯ "1e4" "-34,56e-2" "45 строка" "45,23" "12,32.43" #<SUBR @0fa02a64 IF> "E45-" ("sd" 34) "23.43-E" "178,23e-2")
_$ (mapcar 'conv-to-value test_lst)
(nil 3.14159 nil nil 10000 -0.3456 nil 45.23 nil nil nil nil nil 1.7823)
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 28.12.2010, 16:50
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


несколько лет назад, тоже решал такую задачку для конкурса форума cadxp.com, может и здесь сгодится...
Код:
[Выделить все]
(defun str->list (s)
                 ;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
*
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
***************************************************************************************
* Пример использования и результатов работы:
* (str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (str->list "qvf12qsdf125 5sf 56dfv2") => ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2)
***************************************************************************************
 |;
 (defun str->list1 (a b f)
  (cond
   ((null b)
    (list (if f
           (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           )
           (vl-list->string (reverse a))
          )
    )
   )
   (f
    (if (or (= (car b) 44) (< 45 (car b) 58))
     (str->list1 (cons (car b) a) (cdr b) f)
     (cons (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           )
           (str->list1 (list (car b)) (cdr b) nil)
     )
    )
   )
   (t
    (if (< 47 (car b) 58)
     (cons (vl-list->string (reverse a)) (str->list1 (list (car b)) (cdr b) t))
     (str->list1 (cons (car b) a) (cdr b) nil)
    )
   )
  )
 )
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             )
 )
)
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 28.12.2010, 23:16
#13
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Нашел на болоте
gomer вне форума  
 
Автор темы   Непрочитано 29.12.2010, 11:24
#14
back1981


 
Регистрация: 23.07.2009
Сообщений: 29


О, сколько вариантов. Может это показаться не эффективным, я создаю на генплане в отдельном слое полилинии условного кабеля для нужд КИПиА. Каждой полилинии я записываю в расширенные данные (поз.1000 DXF) строку формата ("904-1;КВВГЭнг;19;1.5;1"). После прокладки всех кабелей, можно пользоваться этими данными по своему усмотрению, например, для составления кабельных журналов, спецификаций кабеля и т.д. На данный момент я сделал окно для внесения расширенных данных, а также сделал сортировку, по наименованию кабеля, жильности, сечения, этапа строительства. Зная масштаб, возможно определение метража кабеля. Вобщем специфика такая. Кстати, как определят ваши программы строку "904-1" или "123сто двадцать три"?
back1981 вне форума  
 
Непрочитано 29.12.2010, 12:11
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от back1981 Посмотреть сообщение
Кстати, как определят ваши программы строку "904-1" или "123сто двадцать три"?
моя программа:
Код:
[Выделить все]
(str->list "904-1") ;=>> (904 "-" 1)
(str->list "123сто двадцать три") ;=>> (123 "сто двадцать три")
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 29.12.2010, 20:54
#16
back1981


 
Регистрация: 23.07.2009
Сообщений: 29


Забыл добавить, строку вида "904-1;КВВГЭнг;19;1.5;1;" я разбиваю на элементы строки (но это другая история) по признаку знака ";" и скажем элемент типа "904-1" мне нужен именно как строка так, как это маркировка кабеля. Задача стоит такая, если в строке находится элемент отличный от 1234567890 (даже пробел), то однозначно это строка, но вот с вещественными числами тогда проблема ведь есть знак ".". Алгоритм конкретно для моей задачи вижу следующий, каждый элемент проверяю на предмет not (1234567890), если правда, то на предмет наличия знака ".", если правда то надо проверить является ли это строковым отображением вещественного числа, если проверку не проходит, то строка. Если not (1234567890) не правда то это целочисленное число. Тут я смотрю подобные варианты есть. Или мне придется мои данные хранить вот в таком примитивном виде типа "S=904-1;S=КВВГЭ;N=19;F=1.5;N=2;", что скорее всего упростит мне задачу, ведь я явно уже указываю на тип данных. Других задач не преследую, задача стоит именно занести расширенные данные в полилинию и далее уже делать выборки по тем или иным признакам и не больше. За примеры спасибо.

Последний раз редактировалось back1981, 29.12.2010 в 21:01.
back1981 вне форума  
 
Непрочитано 29.12.2010, 22:14
#17
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от back1981 Посмотреть сообщение
Или мне придется мои данные хранить вот в таком примитивном виде типа "S=904-1;S=КВВГЭ;N=19;F=1.5;N=2;",
Данные в лиспе принято хранить в виде списка, лучше ассоциативного
gomer вне форума  
 
Непрочитано 30.12.2010, 23:55
#18
Li6-D


 
Регистрация: 03.05.2009
Сообщений: 112


В рамках поставленной автором задачи написал функцию преобразующую строку из элементов, разделенных знаком ";" в список чисел (если элемент строки является строковым представления числа) и исходных элементов строки (в противном случае).
В качестве разделителя десятичных знаков кроме точки может использоваться запятая (как в Экселе).

Примеры преобразований элементов:
" - 19 " в 19 - аналогично (atoi " - 19 ");
" - 1.5 " или " - 1,5 " в -1.5;
".2" или "+ ,2 " в 0.2;
" 3," или "3.000" в 3.0.

Не преобразуются:
". 2" - есть пробел между знаками;
"7..7" - лишняя точка.
"4.23E2", "Pi" - слишком шикарно для кода размером 906 байт
Код:
[Выделить все]
(defun str->c&sN (str / str->c*s n c&sN)
  (defun str->c*s (str / fs s txt s10 sc d s-)
    (defun fs ()
      (setq s (substr txt 1 1) txt (substr txt 2))
      (if (= s "") (setq s nil) s)
    )
    (setq s10 "0123456789" sc "" d 1 txt (vl-string-trim " " str))
    (if (cond ((= (fs) "-") (setq s- t)) ((= s "+")))
      (setq txt (vl-string-left-trim " " txt) s (fs)))
    (while (and s (vl-string-search s s10))
      (setq sc (strcat sc s)) (fs))
    (and
      s
      (vl-string-search s ".,")
      (setq sc (strcat sc ".") d 2)
      (while (and (fs) (vl-string-search s s10))
        (setq sc (strcat sc s)))
    )
    (if (or s (< (strlen sc) d))
      str
      (* (read (strcat "0" sc)) (if s- -1 1))
  ) )
  (while (setq n (vl-string-search ";" str))
    (setq c&sN (cons (str->c*s (substr str 1 n)) c&sN)
          str (substr str (+ n 2)))
  )
  (reverse c&sN)
)

Пример:
Команда: (STR->C&SN "904-1;КВВГЭнг;19; - 1.5 ;+1; 4 . 3 ;,2;45.;7..7;';")
("904-1" "КВВГЭнг" 19 -1.5 1 " 4 . 3 " 0.2 45.0 "7..7" "'")

Последний раз редактировалось Li6-D, 31.12.2010 в 00:50.
Li6-D вне форума  
 
Непрочитано 31.12.2010, 01:28
#19
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Код:
[Выделить все]
(defun test123 (lst /  )
; (untrace sl_is_num_)
; (trace sl_is_num_)
(mapcar (function (lambda (x) 
(if (sl_is_num_ x 2)
(sl-conv-value-to-real x)
(sl-conv-value-to-string x)
)
))
lst
)

)

(defun sl-conv-value-to-string (value / )
; 11a>
                                   ;|
*    конвертация значения в строку. Для VLA-объектов возвращается nil
*    Точечные списки не обрабатываются.
|;
  (if value
    (vl-princ-to-string value)
    ""
    ) ;_ end of if
  )


  (defun sl-conv-value-to-real (value / )
; 12a>
                                 ;|
*    конвертация значения в целое. Для VLA-объектов возвращается nil
*    Точечные списки не обрабатываются.
|;
  (atof (sl-conv-value-to-string value))
  )

  
(defun sl_is_num_ ( str n / )

; Функция проверяющая входящую текстовую строку на число не число, если входящая текстовая строка будет с запятой то выдастся строка с точкой
; если есть хоть одна буква в тексте, запятая не в счет, то возвращается nil 
; n - целое число, сколько знаков после запятой будет в возвращаемой строке

(if (vl-string-search "-" str)
(if (equal (vl-string-position 45 str) 0)
(if
(or 
(wcmatch str "*[~-0123456789.`,]*") 
(not (wcmatch str "*[-0123456789]*"))
)



nil
(cond 
((equal str nil) nil)
( (vl-string-search "," str) 
(sl_rtos_ (vl-string-subst "." "," str ) n)
)
( (vl-string-search "." str) 
(sl_rtos_ str n)
)
( str
(sl_rtos_ str n)
)

(nil)
)
)
nil
)

(if
(or 
(wcmatch str "*[~0123456789.`,]*") 
(not (wcmatch str "*[0123456789]*"))
)


nil
(cond 
((equal str nil) nil)
( (vl-string-search "," str) 
(sl_rtos_ (vl-string-subst "." "," str ) n)
)
( (vl-string-search "." str) 
(sl_rtos_ str n)
)
( str
(sl_rtos_ str n)
)

(nil)
)
)
)
)



(defun sl_rtos_ (number digit / tmp dot)
 ;;; Назначение:
  ;;; Конвертирование  числа в строку з заданным количеством знаков
  ;;; после разделителя   digit
    ;;; Использует функцию библиотеки
    ;;;                 sl_string_left_part_
    ;;;                 sl-string-right-part
    ;;;                 sl-string-align-to-right
 
    ;;; Параметры: 
    ;;; number - конвертируемое число (real)
    ;;; digit  - количество знаков после запятой
    ;;; Возврат:
    ;;;   строку (String)

; (sl-conv-real-to-str -1.2 6) ;_ Результат  "-1.200000"
; (sl-conv-real-to-str 1.123456789012345678901234567890  24) ;_ Результат "1.123456789012345000000000"
; (sl-conv-real-to-str 1.056789 3) ;_ Результат   "1.057"
; (sl-conv-real-to-str -0.5 3) ;_ Результат   "-0.500"
; (sl-conv-real-to-str 2 6) ;_ Результат   "2.000000"
(setq number (sl-conv-value-to-real number))
  (setq tmp (rtos number 2 digit)
        dot ".")
  (strcat
    (sl_string_left_part_ tmp dot)
    dot
    (sl_string_align_to_right_ (sl_string_right_part_   tmp dot) digit "0")
  ) ;_ end of strcat
) ;_ end of defun





(defun sl_string_right_part_ (string delim_char)
;;; возврат правой половины строки после разделителя
;;; Использует функцию библиотеки
    ;;;                 _dwgru-string-some-part
    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delim_char  - разделитель (string)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:
  

; (sl_string_right_part_ " M1:=100" "=")   ;_Результат  "100"
; (sl_string_right_part_ " M= M1:=100" "=") ;_Результат  "100"
; (sl_string_right_part_ "просто строка" "=") ;_Результат   "просто строка"
; (sl_string_right_part_ "просто=" "=")  ;_ ""
; (sl_string_right_part_ "890" ".")  ;_Результат  ""
; (sl_string_right_part_ ".2" ".")  ;_Результат  2
; (sl_string_right_part_ "2" ".")  ;_Результат  "" 
; (sl_string_right_part_ "2.400" ".") ;_Результат  "400"

    (sl_string_some_part_ string delim_char NIL)
) ;_ end of defun



(defun sl_string_left_part_ (string delim_char)
;;; возврат левой половины строки до разделителя delim_char
;;; Использует функцию библиотеки
    ;;;                 _dwgru-string-some-part

    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delim_char  - разделитель (string)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:

; (sl_string_left_part_ " M1:=100" "=")  ;_Результат  " М1:"
; (sl_string_left_part_ " M= M1:=100" "=")  ;_Результат  " М"
; (sl_string_left_part_ "просто строка" "=") ;_Результат   "просто строка"
; (sl_string_left_part_ "просто=" "=")  ;_Результат  "просто"

(sl_string_some_part_ string delim_char T)
)

(defun sl_string_some_part_
                              (string delim_char is_left_part / lst)
    ;;;  возврат левой (если is_left_part)или правой части
    ;;;  строки string с разделителем  delim_char
    ;;; Использует функцию библиотеки
    ;;;                 sl_string_to_list_

    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delim_char  - разделитель (string)
    ;;; is_left_part  - T или NIL . Если истина (T), то слева. Иначе справа. (boolean)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:

; (sl_string_some_part_ " M1:=100" "=" T) ;_Результат   " M1:"
; (sl_string_some_part_ " M1:=100" "=" NIL)  ;_Результат  "100"
; (sl_string_some_part_ " M= M1:=100" "=" T) ;_ Результат  " M"
; (sl_string_some_part_ " M= M1:=100" "=" NIL) ;_ Результат  "100"
; (sl_string_some_part_ "просто строка" "=" T)  ;_ Результат  "просто строка"
; (sl_string_some_part_ "просто строка" "=" NIL) ;_Результат   ""

  (if (> (length (setq lst
                        (sl_string_to_list_ string delim_char)
                 ) ;_ end of setq
         ) ;_ end of length
         1
      ) ;_ end of >
    ;; если список, иначе была просто строка
    (if is_left_part (car lst) (last lst))
    (if is_left_part string "")
  ) ;_ end of  if
) ;_ end of defun

(defun sl_string_to_list_ (str delimiter / pos)
;;; Возврат списка подстрок строки str с разделителем  delimiter 
;;; Использует функцию библиотеки
    ;;;                 sl_string_replace_
    ;;; Параметры: 
    ;;; string     - исходная строка
    ;;; delimiter  - разделитель (string)
    ;;; Возврат:
    ;;;   строку (String)
  
    ;;; Пример:

; (sl_string_to_list_ "М:1=100" "=") ;_Результат ("М:1" "100")
; (sl_string_to_list_ "М:1=" "=") ;_Результат  ("М:1" "")
; (sl_string_to_list_ "" "=") ;_Результат  ("")
; (sl_string_to_list_ "1 2 3   4   5" " ") ;_Результат  ("1" "2" "3" "4" "5")
 ; (sl_string_to_list_ "Я говорю, он говорит, они говорят" ",")
 ; ;_Результат ("Я говорю" " он говорит" " они говорят")
 ; (sl_string_to_list_ "123456789" "=") ;_Результат  ("123456789") 

  ;;; для варианта, когда разделитель пробел надо
;;; заменить в строке все двойные пробелы на одинарные
    (if (= delimiter (chr 32))
        (setq str (sl_string_replace_ str (strcat (chr 32) (chr 32)) delimiter))
    ) ;_ end of if
    (if (setq pos (vl-string-search delimiter str))
        (cons
            (substr str 1 pos)
            (sl_string_to_list_
                (substr
                    str
                    (+ (strlen delimiter) pos 1)
                ) ;_ end of substr
                delimiter
            ) ;_ end of ru-string-pl-string-to-list
        ) ;_ end of cons
        (cons str '())
    ) ;_ end of if
) ;_ end of defun

(defun sl_string_replace_ (string old_substr new_substr / pos)
;;;    Функция замены вхождений подстроки (old_substr) в исходную строку (string) на новые (new_substr).
;;;    Регистрозависимо
;;;    Параметры вызова:
;;;	string		исходная строка
;;;	ols_substr	старая подстрока
;;;	new_substr	новая подстрока  
    ;;; Возврат:
    ;;;   строку (String)

;;;* Формат вызова:
;;;* (sl_string_replace_ "ИСХОДНАЯ СТРОКА" "СТАРАЯ ПОДСТРОКА" "НОВАЯ ПОДСТРОКА")
;;;* Принимает три аргумента типа 'STR передача аргументов другого типа приводит к ошибке.
;;;* Возвращает строку с заменой всех вхождений старой подстроки в исходной строке на новую.
;;;* Чувствительна к регистру символов. Проверка корректности аргументов не проводится.
;;;* Пример:

 ; (sl_string_replace_ "Здесь были ВаВася и ВаВаВаня. Вася" "Ва" "Бу") ;_Результат   "Здесь были БуБуся и БуБуБуня. Буся"
 ; (sl_string_replace_ "1  2       3" "  " " ") ;_Результат  "1 2 3"

    (while (setq pos (vl-string-search old_substr string))
        (setq string
                 (strcat
                     (substr string 1 pos)
                     new_substr
                     (sl_string_replace_
                         (substr string (+ (strlen old_substr) pos 1))
                         old_substr
                         new_substr
                     ) ;_ end of ru-string-replace
                 ) ;_ end of strcat
        ) ;_ end of setq
    ) ;_ end of while
    string
) ;_ end of defun
Код:
[Выделить все]
: (test123 '("Сторока" "1" "2" "2-2"))
("Сторока" 1.0 2.0 "2-2")

Последний раз редактировалось Sleekka, 31.12.2010 в 01:38.
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > {Конкурс} Lisp. Пребразование в число при возможности

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19