| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Проблема у меня не большая!! |
| Автор: JokeR.StR 7.1.2008, 04:56 | ||||||
| Вот на днях понадобилось перевести из string в double или real а не получилось! Так значит что я делал:
Заместо double писал и real но угу все равно не поучается!! Выдает ошибку типа 12.32 не может быть этим числом(ну типа того). А вот если вот так:
То вот так все работает!! Помогите плз!!
|
| Автор: aktuba 7.1.2008, 07:25 |
| Поменяй точку на запятую. |
| Автор: JokeR.StR 7.1.2008, 13:57 | ||
Так когда я просто присваиваю у меня же присваивание идет!! |
| Автор: Данкинг 7.1.2008, 14:23 | ||||
А почему тогда просто присваивать нельзя? А вообще лучше действительно запятую сделать вместо точки. И чтобы в "региональных стандартах" тоже в качестве разделителя запятая стояла. |
| Автор: remax 7.1.2008, 14:30 | ||||||
используй константу decimalseparator в ней записан символ десятичного разделителя из региональных стандартов".
Добавлено через 6 минут и 13 секунд
Не надо путать строки и вещественные числа. При работе с вещественными числами всегда (!) в качестве разделителя используется точка. А при преобразовании из строки в число в качестве разделителя используется символ из "региональных стандартов". |
| Автор: JokeR.StR 7.1.2008, 14:38 |
| Всем большое спасибо!! |
| Автор: Poseidon 7.1.2008, 15:01 | ||
remax, фиговый у тебя пример
только нафига тут i надо? |
| Автор: MetalFan 7.1.2008, 15:14 |
| забанить бы автора за такой заголовок темы... |
| Автор: remax 7.1.2008, 15:40 | ||||
Гы. Посмотри внимательно на свой и на мой пример. У меня универсально. Что бы не было в исходной строке (точка или запятая), какая бы не была региональная настройка (точка или запятая) - сработает правильно. У тебя допустимы только точки в исходной строке. Вот и вся разница. А переменная i и так уже объявлена. |
| Автор: remax 7.1.2008, 18:02 | ||||
| Исходный пример легко модифицируется с преобразования строковой константы на строковую переменную или скажем свойство TEXT, компонента TEDIT. А писать программы надо так, чтобы легкая модификация не приводила бы к необходимости перелопачивать весь исходник. И учитывая явную неопытность автора темы в программировании имеет смысл показать ему более надежный и универсальный пример. Хотя, 100% надежности не бывает. Скажем, две точки в строке - однозначно фатал. P.S. На мой взгляд тут все прозрачно и очевидно. Странно, что опытный Delphi developer этого не видит. Добавлено через 4 минуты и 41 секунду Не мог удержаться, чтобы не добавить. А с точки зрения эффективности, что предпочтительней использовать
или
|
| Автор: JokeR.StR 7.1.2008, 21:43 | ||
Да я уже заменил
Про это я сам давно знал и этим воспользовался!! |
| Автор: source777 8.1.2008, 00:31 | ||||||
Естественно StringReplace, причём не только с точки зрения эффективности, но и с точки зрения разумности... Если не веришь проверь, StringReplace опережает по быстродействию твой вариант в 1,5 раза
P.S. Не могу не добавить: Нет большего зла в программировании, чем преждевременная оптимизация, тем более неумелая!!! Добавлено @ 00:36 Кстати если расширить вариант со StringReplace до
Это фактически не скажется на быстродействии, и StringReplace побеждает с тем же результатом (быстрее в 1,5 раза) и с тем же уровнем гибкости... |
| Автор: remax 8.1.2008, 01:29 | ||
| гы. А ты, для интереса, замени s0:='124515.2351636'; на скажем, s0:='5.2'; И мой вариант будет ровно в 2 раза быстрее... да, забыл сказать, убери строку 27 - не спортивно по мелочам махлевать. Скажу даже больше, до длины исходной строки 9 символов включительно мой вариант быстрее. Начиная с 10 твой начинает обгонять. Так что не надо огульно так обвинять в неумелой оптимизации... Добавлено через 11 минут и 4 секунды И чтобы окончательно закрыть тему, надо делать так:
По быстродействию это будет примерно в 50 раз быстрее всех предыдущих вариантов. |
| Автор: Yanis 8.1.2008, 01:52 |
| source777, remax Ребят идите… в аську. Или на крайняк в почту/PM. Ваши замеры совсем не по теме тут уже P. S. Cогласен с MetalFan. |
| Автор: remax 8.1.2008, 01:57 |
| Ну вот, а как же истина? все-все ухожу..... |
| Автор: source777 8.1.2008, 16:32 | ||||||||
она необходима, чтобы на каждой итерации было что менять, так что всё спортивно...
Гы, это ты уже какую-то другую задачу решил, изначально все вхождения заменяли, так что нечего даже сравнивать решения двух разных задач... А оптимизация всё же неумелая(так и быть докажу, чтоб не огульно было), ибо нижеследующий код, решая исходную задачу, работает на порядок быстрее и StringReplace, и твоей горе-оптимизации...
Однако, необходимо заметить, что если замену надо выполнить для менее чем тысячи строк подряд, то StringReplace предпочтительнее, ибо оптимизация подобного кода будет не нужна по практическим соображениям, а читабельность будет страдать... А вместо того, чтобы признать тот факт, что ты не знаешь стандартных функций, ты попытался свалить всё на мнимую оптимизацию...
Почему же, пусть человек узнает несколько решений, и поймёт как надо, а как не надо программировать и почему именно так. P.S. Кстати мериться начал remax, с неуместного наезда на разработчиков Delphi... |
| Автор: remax 8.1.2008, 19:29 |
| Не согласен с твоими утверждениями, но, по просьбе Yanisа, дискуссию перенес в почту. Читай в личке... |
| Автор: New Neon 8.1.2008, 23:02 | ||
А вот самый оптимальный помоему вариант:
и перевод и проверка |
| Автор: remax 8.1.2008, 23:40 |
| Оригинально, только не всегда работает. Дело в том, что строка для VAL всегда! (если мне не изменяет память) в качестве разделителя использует точку. Рассмотрим следующий вариант decimalseparator=','; s:='12.32'; в результате после VAL d=0 (нет ошибки) и замена не происходит. Поэтому d:=StrToFloat(s); завершается ошибкой. |
| Автор: New Neon 8.1.2008, 23:48 | ||
| Правильно мыслишь, тогда и заменять то не надо - переведенное значение уже в d. Сори за погрешность исправляю :
|
| Автор: remax 8.1.2008, 23:55 |
| Да, согласен. Так работает. |
| Автор: MetalFan 9.1.2008, 11:16 |
а чем TryStrToFloat не подходит? |
| Автор: New Neon 9.1.2008, 12:18 |
| MetalFan, Согласен, твой вариант даже быстрее работать будет. Как говориться "Век живи - век учись". |