Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема у меня не большая!! 
V
    Опции темы
JokeR.StR
Дата 7.1.2008, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Вот на днях понадобилось перевести из string в double или real а не получилось! 
Так значит что я делал:
Код
procedure TForm1.FormCreate(Sender: TObject);
var i:double;
    s:string;
begin
s:='12.32';
i:=strtofloat(s);
end;

Заместо double писал и real но угу все равно не поучается!! Выдает ошибку типа 12.32 не может быть этим числом(ну типа того).
А вот если вот так:
Код
procedure TForm1.FormCreate(Sender: TObject);
var i:double;
begin
i:=12.32;
end;

То вот так все работает!! Помогите плз!!


M
Alexeis
Модератор: Название темы должно отражать ее суть! В следующий раз просто закрою тему.

PM MAIL   Вверх
aktuba
Дата 7.1.2008, 07:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 7
Всего: 38



Поменяй точку на запятую.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
JokeR.StR
Дата 7.1.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Цитата(aktuba @ 7.1.2008,  05:25)
Поменяй точку на запятую.

Так когда я просто присваиваю у меня же присваивание идет!!
PM MAIL   Вверх
Данкинг
Дата 7.1.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(JokeR.StR @ 7.1.2008,  13:57)
Цитата(aktuba @ 7.1.2008,  05:25)
Поменяй точку на запятую.

Так когда я просто присваиваю у меня же присваивание идет!!

А почему тогда просто присваивать нельзя? А вообще лучше действительно запятую сделать вместо точки. И чтобы в "региональных стандартах" тоже в качестве разделителя запятая стояла.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
remax
Дата 7.1.2008, 14:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



используй константу decimalseparator в ней записан символ десятичного разделителя из региональных стандартов".

Код

procedure TForm1.FormCreate(Sender: TObject);
var i:double;
    s:string;
begin
s:='12.32';
for i:=1 to length(s) do
  if pos (s[i],'.,')>0
     then s[i]:=decimalseparator;
i:=strtofloat(s);
end


Добавлено через 6 минут и 13 секунд
Цитата(JokeR.StR @ 7.1.2008,  10:57)
Цитата(aktuba @ 7.1.2008,  05:25)
Поменяй точку на запятую.

Так когда я просто присваиваю у меня же присваивание идет!!

Не надо путать строки и вещественные числа. При работе с вещественными числами всегда (!) в качестве разделителя используется точка. А при преобразовании из строки в число в качестве разделителя используется символ  из "региональных стандартов".

Это сообщение отредактировал(а) remax - 7.1.2008, 14:34


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
JokeR.StR
Дата 7.1.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Всем большое спасибо!!
PM MAIL   Вверх
Poseidon
Дата 7.1.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



remax, фиговый у тебя пример smile

Код
procedure TForm1.FormCreate(Sender: TObject);
var 
i:double;
s:string;
begin
s:= StringReplace('12.32', '.', DecimalSeparator, [rfReplaceAll]);
i:=StrToFloat(s);
end;


только нафига тут i надо?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
MetalFan
Дата 7.1.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



забанить бы автора за такой заголовок темы...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
remax
Дата 7.1.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Цитата(Poseidon @ 7.1.2008,  12:01)
remax, фиговый у тебя пример smile

Код
procedure TForm1.FormCreate(Sender: TObject);
var 
i:double;
s:string;
begin
s:= StringReplace('12.32', '.', DecimalSeparator, [rfReplaceAll]);
i:=StrToFloat(s);
end;


только нафига тут i надо?

Гы. Посмотри внимательно на свой и на мой пример.
У меня универсально. Что бы не было в исходной строке (точка или запятая), какая бы не была региональная настройка (точка или запятая) - сработает правильно. У тебя допустимы только точки в исходной строке.
Вот и вся разница.
А переменная i и так уже объявлена.  smile 


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 7.1.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(remax @  7.1.2008,  15:40 Найти цитируемый пост)
У меня универсально. Что бы не было в исходной строке (точка или запятая), какая бы не была региональная настройка (точка или запятая) - сработает правильно. 
В исходной строке у тебя тоже точка. Она в пятой строчке твоего кода  прописана smile Поэтому нет смысла искать запятую в троке в которой точно известно что стоит точка.

Цитата(remax @  7.1.2008,  15:40 Найти цитируемый пост)
А переменная i и так уже объявлена.

Она объявлена, это да. Только: 
Цитата(Poseidon @  7.1.2008,  15:01 Найти цитируемый пост)
нафига тут i надо? 




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
remax
  Дата 7.1.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



Исходный пример легко модифицируется с преобразования строковой константы на строковую переменную или скажем свойство TEXT, компонента TEDIT. 
А писать программы надо так, чтобы легкая модификация не приводила бы к необходимости перелопачивать весь исходник. И учитывая явную неопытность автора темы в программировании имеет смысл показать ему более надежный и универсальный пример. Хотя, 100% надежности не бывает. Скажем, две точки в строке - однозначно фатал.

P.S. На мой взгляд тут все прозрачно и очевидно. Странно, что опытный Delphi developer  этого не видит.

Добавлено через 4 минуты и 41 секунду
Не мог удержаться, чтобы не добавить. smile 


А с точки  зрения  эффективности, что предпочтительней использовать 
Код

function StringReplace(const S, OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;
var
  SearchStr, Patt, NewStr: string;
  Offset: Integer;
begin
  if rfIgnoreCase in Flags then
  begin
    SearchStr := AnsiUpperCase(S);
    Patt := AnsiUpperCase(OldPattern);
  end else
  begin
    SearchStr := S;
    Patt := OldPattern;
  end;
  NewStr := S;
  Result := '';
  while SearchStr <> '' do
  begin
    Offset := AnsiPos(Patt, SearchStr);
    if Offset = 0 then
    begin
      Result := Result + NewStr;
      Break;
    end;
    Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
    NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
    if not (rfReplaceAll in Flags) then
    begin
      Result := Result + NewStr;
      Break;
    end;
    SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
  end;
end;



или

Код

for i:=1 to length(s) do
  if pos (s[i],'.,')>0
     then s[i]:=decimalseparator;







Это сообщение отредактировал(а) remax - 7.1.2008, 18:03


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
JokeR.StR
Дата 7.1.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Да я уже заменил 
Код
for i:=1 to length(s) do
  if pos (s[i],'.,')>0
     then s[i]:=decimalseparator;

Про это я сам давно знал и этим воспользовался!!
PM MAIL   Вверх
source777
Дата 8.1.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(remax @ 7.1.2008,  16:02)
Не мог удержаться, чтобы не добавить. smile 


А с точки  зрения  эффективности, что предпочтительней использовать 
...

Естественно StringReplace, причём не только с точки зрения эффективности, но и с точки зрения разумности...
Если не веришь проверь, StringReplace опережает по быстродействию твой вариант в 1,5 раза
Код

procedure TForm1.Button1Click(Sender: TObject);
const N=1000000;
var t0, t1, t2, t3: Cardinal;
i,j: integer;
s, s0: string;
begin
  s0:=\\\'124515.2351636\\\';
  s:=s0;

  t0:=GetTickCount;
  for i:=1 to N do
  begin
    s:=s0;
  end;
  t1:=GetTickCount-t0;

  t0:=GetTickCount;
  for i:=1 to N do
  begin
    s:= StringReplace(s0, \\\'.\\\', DecimalSeparator, [rfReplaceAll]);
  end;
  t2:=GetTickCount-t0;

  t0:=GetTickCount;
  for i:=1 to N do
  begin
    s:=s0;
    for j:=1 to length(s0) do
    if pos (s0[j],\\\'.,\\\')>0
      then s[j]:=decimalseparator;
  end;
  t3:=GetTickCount-t0;

  Label1.Caption:=IntToStr(t2-t1)+#13+IntToStr(t3-t1);
end;


P.S. Не могу не добавить: Нет большего зла в программировании, чем преждевременная оптимизация, тем более неумелая!!!

Добавлено @ 00:36
Кстати если расширить вариант со StringReplace до 
Код

    sep:=\\\'.\\\';
    if (DecimalSeparator=sep) then sep:=\\\',\\\';
    s:= StringReplace(s0, sep, DecimalSeparator, [rfReplaceAll]);

Это фактически не скажется на быстродействии, и StringReplace побеждает с тем же результатом (быстрее в 1,5 раза) и с тем же уровнем гибкости... smile 

Это сообщение отредактировал(а) source777 - 8.1.2008, 00:39


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
remax
  Дата 8.1.2008, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



гы. А ты, для интереса, замени s0:='124515.2351636'; на скажем, s0:='5.2';  smile 

И мой вариант будет ровно в 2 раза быстрее...

да, забыл сказать, убери строку 27 - не спортивно по мелочам махлевать.
 
Скажу даже больше, до длины исходной строки 9 символов включительно мой вариант быстрее.
Начиная с 10 твой начинает обгонять. Так что не надо огульно так обвинять в неумелой оптимизации...

Добавлено через 11 минут и 4 секунды
И чтобы окончательно закрыть тему, надо делать так:
Код

    j:=pos ('.',s0);
    if j=0 then j:=pos (',',s0);
    if j<>0 then s[j]:=decimalseparator;


По быстродействию это будет примерно в 50 раз быстрее всех предыдущих вариантов. 


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
Yanis
Дата 8.1.2008, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 6
Всего: 111



source777remax
Ребят идите… в аську. Или на крайняк в почту/PM. 
Ваши замеры совсем не по теме тут уже smile

PS. Cогласен с MetalFan.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.