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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Преобразование значения в строку

DwgRuLispLib: Преобразование значения в строку

Ответ
Поиск в этой теме
Непрочитано 28.11.2007, 22:50
DwgRuLispLib: Преобразование значения в строку
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,787

Код:
[Выделить все]
(defun _dwgru-conv-value-to-string (value)
                                   ;|
*    Преобразование значения в строку. Для nil возвращает пустую строку.
*    Примеры вызова:
(_dwgru-conv-value-to-string 123)	; "123"
(_dwgru-conv-value-to-string 123.50)	; "123.5"
(_dwgru-conv-value-to-string "qwer")	; "qwer"
|;
  (cond
    ((not value) "")
    ((= (type value) 'str) value)
    (t (vl-princ-to-string value))
    ) ;_ end of cond
  ) ;_ end of defun
P.S. Код сформирован благодаря Александру Ривилису.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 29.11.2007 в 00:27.
Просмотров: 27273
 
Непрочитано 30.11.2007, 09:19
#21
vic153

проектировщик газопроводов
 
Регистрация: 04.08.2005
Петербург
Сообщений: 325


Может тогда точность функции rtos задавать переменной? пришло вещественное число в функцию, определяем сколько знаков после запятой и это количество задаем как точность. А то действительно почему точность 15, а не любая другая. В тоже время VVA говорит, что какой число пришло такое же должно и вернуться.
vic153 вне форума  
 
Непрочитано 30.11.2007, 09:38
#22
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от vic153 Посмотреть сообщение
Может тогда точность функции rtos задавать переменной? пришло вещественное число в функцию, определяем сколько знаков после запятой и это количество задаем как точность.
Именно так и работет rtos - возврат зависит от значения переменных UNITMODE, DIMZIN, LUNITS и LUPREC. Влияние части из них может быть подавлено аргументами при вызове rtos, а части - нет.
Alaspher вне форума  
 
Непрочитано 30.11.2007, 09:53
#23
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Alaspher Посмотреть сообщение
Именно так и работет rtos - возврат зависит от значения переменных UNITMODE, DIMZIN, LUNITS и LUPREC. Влияние части из них может быть подавлено аргументами при вызове rtos, а части - нет.
Ну, снял камень с души. Автокад не виноватый, это я про DIMZIN забыл.
Теперь вспомнил, что когда
(rtos -0.5 2 3) может вернуть "-0.5", то (ru-rtos -0.5 3) всегда вернет
"-0.500". Совсем плохой стал
ShaggyDoc вне форума  
 
Непрочитано 30.11.2007, 10:24
#24
VVA

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


Давайте разберемся насчет 15.
Примеры в #11 + эти
Код:
[Выделить все]
 
(rtos (* a 1e3) 2 16) ;_ "1123456.789012346" 
(rtos (* a 1e9) 2 15) ;_ "1123456789.012346"
показывают, что:
1. общая максимальная длинна строки, возвращаемой rtos = 17
2. (rtos xxx yyy 15) и (rtos xxx yyy 16) на результат уже не влияют
Еще один эксперимент
Код:
[Выделить все]
(setq a 1.123456789012345678901234567890)
(setq b (* a 1e6))
(setq c (- b (fix b)))
(rtos c 2 16)            ;_ -> "0.7890123457182199" 
(rtos (fix b) 2 16)     ;_ -> "1123456"
a -> 1123456789012345678901234567890
b+c -> 11234567890123457182199
Как видно, начиная с 15 знака после запятой точность хранения вещественных чисел не соблюдается. Именно поэтому rtos 15 и rtos 16 на результат не влияют. Это к вопросу, стоит ли биться за 64 знак после запятой.
Правильно заметил Alaspher, что затронули rtos, надо решать вопрос с DIMZIN или "делать копию rtos".
Вообще я бы не имел "претензий" к vl-princ-to-string, если бы она возвращала знаков 9, а не 5 как сейчас.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.11.2007, 12:25
#25
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Не по правилам наверно (а кто их читал?), но вставляю сюда связанные функции. До кучи. Чтоб никто не догадался, где они.

Код:
[Выделить все]
 
(defun dwgru-conv-real-to-str (number digit / tmp dot)
;;; Конвертирование  числа в строку з заданным количеством знаков
;;; после разделителя   digit
;|
(dwgru-conv-real-to-str -1.2 6) "-1.200000"
(dwgru-conv-real-to-str 1.123456789012345678901234567890  24) > "1.123456789012345000000000"
(dwgru-conv-real-to-str 1.056789 3) > "1.057"
(dwgru-conv-real-to-str -0.5 3) > "-0.500"
(dwgru-conv-real-to-str 2 6) > "2.000000"
|;
  (setq tmp (rtos number 2 digit)
        dot ".")
  (strcat
    (dwgru-string-left-part tmp dot)
    dot
    (dwgru-string-align-to-right (dwgru-string-right-part   tmp dot) digit "0")
  ) ;_ end of strcat
) ;_ end of defun
(defun _dwgru-string-align (string str_len sym is_left /  sym_count)
  ;;; выравнивает строку string до длины str_len
  ;;; символами sym слева если is_left, иначе справа
  ;;; (_dwgru-string-align "121" 20 "0" T) > "00000000000000000121"
  ;;; (_dwgru-string-align "121" 20 "0" NIL) > "12100000000000000000"
  (if (> (setq
           sym_count (- str_len (strlen string))
         ) ;_ end of setq
         1
      ) ;_ end of >
    (repeat sym_count
      (setq string (if is_left
                     (strcat sym string)
                     (strcat string sym)
                   ) ;_ end of if
      ) ;_ end of setq
    ) ;_ end of repeat
  ) ;_ end of if
  string
)
 
(defun dwgru-string-align-to-left (string str_len sym)
  ;;; выравнивает строку string до длины str_len  символом sym слева
  ;;; (dwgru-string-align-to-left "123" 10 "0") "0000000123"
  (_dwgru-string-align string str_len sym T)
 
)
(defun dwgru-string-align-to-right (string str_len sym)
 ;;; выравнивает строку string до длины str_len  символом sym справа
 ;;;(dwgru-string-align-to-right "123" 10 "0") "1230000000"
  (_dwgru-string-align string str_len sym NIL)
)
(defun _dwgru-string-some-part
                              (string delim_char is_left_part / lst)
;;;  возврат левой (если is_left_part)или правой части
;;;  строки string с разделителем  delim_char
;;;(_dwgru-string-some-part " M1:=100" "=" T)  " M1:"
;;;(_dwgru-string-some-part " M1:=100" "=" NIL)  " "100"
;;;(_dwgru-string-some-part " M= M1:=100" "=" T)  " M"
;;;(_dwgru-string-some-part " M= M1:=100" "=" NIL)  "100"
;;;(_dwgru-string-some-part "просто строка" "=" T)  "просто строка"
;;;(_dwgru-string-some-part "просто строка" "=" NIL)  ""
  (if (> (length (setq lst
                        (dwgru-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 dwgru-string-left-part (string delim_char)
;;; возврат левой половины строки до разделителя
;;;(dwgru-string-left-part " M1:=100" "=")  "100"
;;;(dwgru-string-left-part " M= M1:=100" "=")  "100"
;;;(dwgru-string-left-part "просто строка" "=")  "просто строка"
;;;(dwgru-string-left-part "просто=" "=")  ""
  (_dwgru-string-some-part string delim_char T)
)
(defun dwgru-string-right-part (string delim_char)
  ;; возврат правой половины строки после разделителя
;;;(dwgru-string-right-part " M1:=100" "=")  "100"
;;;(dwgru-string-right-part " M= M1:=100" "=")  "100"
;;;(dwgru-string-right-part "просто строка" "=")  "просто строка"
;;;(dwgru-string-right-part "просто=" "=")  ""
;;;(dwgru-string-right-part "890" ".")  ""
;;;(dwgru-string-right-part ".2" ".")  2
;;;(dwgru-string-right-part "2" ".")  "2" дб ""
;;;(dwgru-string-right-part "2.400" ".")  ""
    (_dwgru-string-some-part string delim_char NIL)
) ;_ end of defun
(defun dwgru-string-to-list (str delimiter / pos)
;;; Возврат списка подстрок строки str с разделителем  delimiter 
    ;|
(dwgru-string-to-list "М:1=100" "=")
("М:1" "100")
(dwgru-string-to-list "М:1=" "=")
("М:1" "")
(dwgru-string-to-list "" "=")
("")
(dwgru-string-to-list "1 2 3   4   5" " ")
("1" "2" "3" "4" "5")
 (dwgru-string-to-list "Я говорю, он говорит, они говорят" ",")
 ("Я говорю" " он говорит" " они говорят")
 (dwgru-string-to-list "123456789" "=")
 ("123456789") 
|;
  ;;; для варианта, когда разделитель пробел надо
;;; заменить в строке все двойные пробелы на одинарные
    (if (= delimiter (chr 32))
        (setq str (dwgru-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)
            (dwgru-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 dwgru-string-replace (string old_substr new_substr / pos)
;;;* Формат вызова:
;;;* (dwgru-string-replace "ИСХОДНАЯ СТРОКА" "СТАРАЯ ПОДСТРОКА" "НОВАЯ ПОДСТРОКА")
;;;* Принимает три аргумента типа 'STR передача аргументов другого типа приводит к ошибке.
;;;* Возвращает строку с заменой всех вхождений старой подстроки в исходной строке на новую.
;;;* Чувствительна к регистру символов. Проверка корректности аргументов не проводится.
;;;* Пример:
;;;* _$ (dwgru-string-replace "Здесь были ВаВася и ВаВаВаня. Вася" "Ва" "Бу")
;;;* "Здесь были БуБуся и БуБуБуня. Буся"
;;; (dwgru-string-replace "1  2       3" "  " " ") > "1 2 3"
;;; "1 2   3"
    (while (setq pos (vl-string-search old_substr string))
        (setq string
                 (strcat
                     (substr string 1 pos)
                     new_substr
                     (dwgru-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
Полный простор для совершенствования.
ShaggyDoc вне форума  
 
Непрочитано 06.12.2007, 19:25
#26
VVA

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


Функция преобразования числа в строку. Автор Сергей Зуев (ShaggyDoc)

dwgru-conv-real-to-str - Конвертирование числа в строку с заданным количеством знаков после разделителя digit
(dwgru-conv-real-to-str -1.2 6) ;_ Результат "-1.200000"

Использует функции библиотеки
http://dwg.ru/f/showthread.php?t=15661

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-conv-real-to-str
;;; *
;;; * 03/12/2007 Версия 0001.    Сергей Зуев   (ShaggyDoc)
;;; ************************************************************************
(defun dwgru-conv-real-to-str (number digit / tmp dot)
 ;;; Назначение:
  ;;; Конвертирование  числа в строку з заданным количеством знаков
  ;;; после разделителя   digit
    ;;; Использует функцию библиотеки
    ;;;                 dwgru-string-left-part
    ;;;                 dwgru-string-right-part
    ;;;                 dwgru-string-align-to-right
 
    ;;; Параметры: 
    ;;; number - конвертируемое число (real)
    ;;; digit  - количество знаков после запятой
    ;;; Возврат:
    ;;;   строку (String)
;|
(dwgru-conv-real-to-str -1.2 6) ;_ Результат  "-1.200000"
(dwgru-conv-real-to-str 1.123456789012345678901234567890  24) ;_ Результат "1.123456789012345000000000"
(dwgru-conv-real-to-str 1.056789 3) ;_ Результат   "1.057"
(dwgru-conv-real-to-str -0.5 3) ;_ Результат   "-0.500"
(dwgru-conv-real-to-str 2 6) ;_ Результат   "2.000000"
|;
  (setq tmp (rtos number 2 digit)
        dot ".")
  (strcat
    (dwgru-string-left-part tmp dot)
    dot
    (dwgru-string-align-to-right (dwgru-string-right-part   tmp dot) digit "0")
  ) ;_ end of strcat
) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.12.2007, 19:30
#27
VVA

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


_dwgru-conv-value-to-string - Преобразование значения value в строку. Для nil возвращает пустую строку.
(_dwgru-conv-value-to-string 123.50) ; "123.5"
(_dwgru-conv-value-to-string "qwer") ; "qwer"


Использует функцию библиотеки dwgru-conv-real-to-str из поста #26

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * _dwgru-conv-value-to-string
;;; *
;;; * 03/12/2007 Версия 0001.  
;;; ************************************************************************
 
(defun _dwgru-conv-value-to-string (value)
;;; Преобразование значения value в строку. Для nil возвращает пустую строку.
;;; Использует функцию библиотеки
    ;;;                 dwgru-conv-real-to-str
 
;;;  Примеры вызова:
;;; value - любое lisp значение
;;; ols_substr старая подстрока
 
;|
(_dwgru-conv-value-to-string 123) ; "123"
(_dwgru-conv-value-to-string 123.50) ; "123.5"
(_dwgru-conv-value-to-string "qwer") ; "qwer"
|;
  (cond
    ((not value) "")
    ((= (type value) 'real)(vl-string-right-trim "0." (dwgru-conv-real-to-str value 15)))
    ;;; ((= (type value) 'str) value) ;_надо ли биться за скорость?
    (t (vl-princ-to-string (eval value)))
    ) ;_ end of cond
  ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Преобразование значения в строку

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Преобразование указателя на примитив в vla Кулик Алексей aka kpblc Библиотека функций 5 27.12.2007 13:47
DwgRuLispLib: Преобразование указателя на примитив в ename Кулик Алексей aka kpblc Библиотека функций 1 27.12.2007 13:30
DwgRuLispLib: Преобразование variant или safearray в список Кулик Алексей aka kpblc Библиотека функций 24 30.11.2007 18:53
задание атрибуту значения имени файла Паша Горбунов AutoCAD 5 21.10.2005 19:06