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

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

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

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

Код:
[Выделить все]
(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. Код сформирован благодаря Александру Ривилису.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 29.11.2007 в 00:27.
Просмотров: 20525
 
Непрочитано 29.11.2007, 06:11
#2
ShaggyDoc

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


Строка
Код:
[Выделить все]
 
((= (type value) 'str) value)
лишняя. vl-princ-to-string и так вернёт строку без изменения.
ShaggyDoc вне форума  
 
Непрочитано 29.11.2007, 08:07
#3
Alaspher


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


В строке
Код:
[Выделить все]
(t (vl-princ-to-string value))
лишняя t, а value я бы обернул в eval, както так:
Код:
[Выделить все]
((vl-princ-to-string (eval value)))
иначе:
Код:
[Выделить все]
(setq a 'b
      b 1
)
(_dwgru-conv-value-to-string a) -> "B"
(_dwgru-conv-value-to-string b) -> "1"
Alaspher вне форума  
 
Автор темы   Непрочитано 29.11.2007, 09:05
#4
Кулик Алексей aka kpblc
Moderator

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


Теоретически вариант с проверкой на 'str должен работать быстрее, но практически прирост скорости минимален: с проверкой на str выдает 1610 миллисекунд на выполнение, без проверки - 1656 миллисекунд. Код поменяю. Единственное "но" - к вечеру поближе.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2007, 09:46
#5
VVA

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


Еще есть предложения для типа real возвращать максимальное количество знаков. Я руководствуюсь тем, что результат _dwgru-conv-value-to-string в строковом виде должен максимально соответствовать оригиналу.
Код:
[Выделить все]
 
(_dwgru-conv-value-to-string pi) ;_ Результат  "3.14159" 
(rtos pi 2 12)                            ;_ Результат  "3.14159265359"
Добавить в cond что-то
Код:
[Выделить все]
 
((= (type value) 'real)(rtos value 2 12))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.11.2007, 10:01
#6
Alaspher


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


Цитата:
Сообщение от VVA Посмотреть сообщение
результат _dwgru-conv-value-to-string в строковом виде должен максимально соответствовать оригиналу
Тогда так надо:
Код:
[Выделить все]
(vl-string-right-trim "0." (rtos value 2 15))
Alaspher вне форума  
 
Автор темы   Непрочитано 29.11.2007, 10:04
#7
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
_$ (rtos pi 2 15)
"3.141592653589793"
До какого знака выполнять? И это (пока по крайней мере) на Windows XP Pro (32 bit), ACAD 2005. Вот мне интересно, на 64-битных системах на каком количестве знаков исчезнет разница?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2007, 10:10
#8
Alaspher


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот мне интересно, на 64-битных системах на каком количестве знаков исчезнет разница?
Проверить не на чем, но думаю на том же - интерпретатор ЛИСП, врядли переделают уж очень радикально. Но, в принципе, никто не запрещает сделать и (rtos value 2 64) - оно не сломается
Alaspher вне форума  
 
Непрочитано 29.11.2007, 11:16
#9
VVA

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


По поводу 12, 15, 64 или что-то еще. Наверное, это должно быть максимальное значение, ограниченное здравым смыслом
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.11.2007, 13:17
#10
Alaspher


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


Цитата:
Сообщение от VVA Посмотреть сообщение
По поводу 12, 15, 64 или что-то еще. Наверное, это должно быть максимальное значение, ограниченное здравым смыслом
Здравый смысл, во всех отношения замечательная штука, кроме одного "НО" - он контекстнозависим... Поскольку функция претендует на унивесальность, то ориентироваться надо бы только на технические возможности, так считаю.
Alaspher вне форума  
 
Непрочитано 29.11.2007, 14:25
#11
VVA

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


Кстати, насчет здравого смысла и технических возможностей примерчик
Код:
[Выделить все]
  (setq a 1.123456789012345678901234567890)
  (rtos a 2 14) ;_ "1.12345678901235" 
  (rtos a 2 15) ;_ "1.123456789012346" 
  (rtos a 2 16) ;_ "1.123456789012345" 
  (rtos a 2 17) ;_ "1.123456789012345"
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.11.2007, 14:38
#12
ShaggyDoc

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


Мне кажется, функцию конвертирования надо оставлять "как есть". Что vl-princ-to-string для числа вернет, то и вернет функция.

А форматирование "строковых" чисел делать отдельной функцией. Там тоже может быть много вариантов (лидирующие и завершающие нули, символ десятичной точки). Не надо стремиться всё в одно место загнать. Мне даже rtos пришлось заменять.
ShaggyDoc вне форума  
 
Непрочитано 29.11.2007, 15:30
#13
Alaspher


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Кстати, насчет здравого смысла и технических возможностей примерчик
Код:
[Выделить все]
  (setq a 1.123456789012345678901234567890)
  (rtos a 2 14) ;_ "1.12345678901235" 
  (rtos a 2 15) ;_ "1.123456789012346" 
  (rtos a 2 16) ;_ "1.123456789012345" 
  (rtos a 2 17) ;_ "1.123456789012345"
Интересное наблюдение - получается, что преобразование rtos производит с бОльшей точностью, чем отображает.

Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Мне кажется, функцию конвертирования надо оставлять "как есть". Что vl-princ-to-string для числа вернет, то и вернет функция.
Но, если единственным отличием библиотечной функции от встроенной будет возврат пустой сторки, при отсутствии содержательного значения, то не проще будет прямо в тексте программы набрать: (if value (vl-princ-to-string value) ""), чем искать библиотечную? Потребность именно в такой трактовке nil не выглядит высокой.
Alaspher вне форума  
 
Непрочитано 29.11.2007, 17:03
#14
VVA

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


>Alaspher
+1
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 29.11.2007, 17:08
#15
Кулик Алексей aka kpblc
Moderator

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


То есть, я так понимаю, такая "функция" нафиг не требуется. Зер гуд
P.S. А вот вариант "замены rtos" посмотреть было бы любопытно...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.11.2007, 18:04
#16
VVA

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


Не правильно понимаете. Такая функция "нафиг" требуется. Речь просто о том, данные на входе и выходе должны совпадать. Только на выходе - строка.
Вызывая функцию (_DWGRU-CONV-VALUE-TO-STRING 'ABCD) я вправе ожидать на выходе "ABCD", а не "ABC"
Это же справедливо и для
(_DWGRU-CONV-VALUE-TO-STRING 1.111222333444555).
На выходе должно быть не "1.11122" как сейчас, а "1.111222333444555".
Понятно, что в представлении и обработке вещественных чисел есть нюансы. Но это нюансы надо максимально приблизить к оригиналу c учетом ограничений Автокада. Поэтому и предлагаю для real внести строчку
((= (type value) 'real)(rtos value 2 15))
Назначение такой ф-ции вижу как "Гарантированно возвращать строку, максимально похожую на оригинал"
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 29.11.2007, 21:48
#17
ShaggyDoc

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


Цитата:
Но, если единственным отличием библиотечной функции от встроенной будет возврат пустой сторки, при отсутствии содержательного значения, то не проще будет прямо в тексте программы набрать: (if value (vl-princ-to-string value) ""), чем искать библиотечную? Потребность именно в такой трактовке nil не выглядит высокой.
У меня есть подобная функция. После множества экспериментов оказалось, что она действительно не нужна. В нескольких тысячах LSP она использована всего 2 раза. А была она в разных вариантах, в том числе с возвратом "". Не пригодилось - в результате она стала простой оберткой vl-princ-to-string, что бессмысленно.

Но подобная функция могла бы быть полезной, если добавить в аргументы значение по умолчанию если value NIL. Для этого варианта умолчанием мог бы быть и NIL, и пустая строка, и что-то еще в зависимости от контекста вызова.

Насчет разрядности возврата значений для real всё-таки предлагаю это в отдельную функцию. Почему, например, именно 15 знаков? А если надо не 1.11122 и не 1.111222333444555, а 1.11122300000? Или 0001.11000
ShaggyDoc вне форума  
 
Непрочитано 30.11.2007, 07:58
#18
Alaspher


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


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Насчет разрядности возврата значений для real всё-таки предлагаю это в отдельную функцию. Почему, например, именно 15 знаков? А если надо не 1.11122 и не 1.111222333444555, а 1.11122300000? Или 0001.11000
Так вот она и есть, эта отдельная функция. А если и делать копию rtos, то только ради того, чтобы иметь легкоуправляемый возврат хвостовых нулей. Других задач я не вижу.
Alaspher вне форума  
 
Непрочитано 30.11.2007, 08:52
#19
ShaggyDoc

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
P.S. А вот вариант "замены rtos" посмотреть было бы любопытно...
Да ничего там любопытного. Просто сейчас, не могу вспомнить почему сделал. Зачем - помню. Вдруг в какой-то версии AutoCAD (вроде в 2005 или 2006) штатная (rtos number 2 3) стала вдруг выдавать неправильный формат, а это было недопустимо. Ранее тоже не наблюдалось. rtos, естественно, всегда вызываю с полным набором аргументов.

Но сейчас, в AutoCAD 2008, rtos возвращает правильный результат. Чувствую себя идиотом
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 30.11.2007, 09:07
#20
Кулик Алексей aka kpblc
Moderator

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


Могу обрадовать - на 2008 сидят далеко не все
(в сторону): Интересно, а кем мне тогда себя чувствовать, когда в 2002 при попытке записать ldata на блок *Model_space* вываливалась ошибка, а в 2005 это нормально работало?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.11.2007, 09:19
#21
vic153

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


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


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


Цитата:
Сообщение от 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"В
Сообщений: 10,930


Цитата:
Сообщение от 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,788
<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"В
Сообщений: 10,930


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

Код:
[Выделить все]
 
(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,788
<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,788
<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