Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2009, 23:44   #1
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию Как узнать какой символ является розделителем дроной части

Собственно вопрос, может я туплю но всеже

Код:
var
 a : double;
begin
 a := '678.1';
 Showmessage(FloatToStr(a)); // Показует 678.1
 a := StrToFloat('678.1'); <<== а вот здесь ошибка
end;
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось DarkEvil; 12.08.2009 в 23:47. Причина: Сори за косой заголовок, я пытаюсь быть грамотным :-)
DarkEvil вне форума Ответить с цитированием
Старый 12.08.2009, 23:55   #2
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Если числом пишете, то надо точку, а если строкой, то запятую.
Сами подумайте, в строке можно писать запятые, а в числах запятая - разделитель кода (как, например, параметров).
Так что код будет вот так работать:
Код:
procedure TForm1.bt_1Click(Sender: TObject);
var
 a : double;
begin
 a := 678.1;
 Showmessage(FloatToStr(a));
 a := StrToFloat('678,1');
end;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 12.08.2009, 23:58   #3
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Да я почему-то подумал(торможу) что это связано с региональными стандартами
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!
DarkEvil вне форума Ответить с цитированием
Старый 13.08.2009, 00:07   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще то связвнно но в России принята запятая
а вообще узнается он тут:
DecimalSeparator из модуля SysUtils
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2009, 00:12   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) в Дельфи есть переменная DecimalSeparator
в начале программы DecimalSeparator := '.';
и всё. дальше можно StrToFloat('123.24')


2) можно использовать такой код (кидаю прямо кусок из рабочей программы, лишнее уберёте сами :
Код:
var
    dResult : double;
    repl_char : char;
...
  if DecimalSeparator = '.' then repl_char := ',' else repl_char := '.';
  StrReplace(S, repl_char , DecimalSeparator, [rfIgnoreCase, rfReplaceAll]);
  try
    dResult := StrToFloat(S)
  except
    dResult := -1;
  end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.08.2009, 00:19   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
в начале программы DecimalSeparator := '.';
не факт...у меня запятая
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.08.2009, 00:35   #7
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

DecimalSeparator служит для других целей, по-умолчанию, по крайней мере у меня, запятая.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 13.08.2009, 05:20   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Кто сомневается, что FloatToStr и StrToFloat используют именно DecimalSeparator, может посмотреть их код в модуле sysutils.pas.

А инициализируется эта переменная там же из системной локали:
Код:
  DecimalSeparator := GetLocaleChar(DefaultLCID, LOCALE_SDECIMAL, '.');
Black Fregat вне форума Ответить с цитированием
Старый 13.08.2009, 08:05   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Господа, не ссорьтесь
Цитата:
по крайней мере у меня, запятая.
Вот вот. Поэтому я всегда делаю так:
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var c:Char;s:string;d:double;
begin
 c:=DecimalSeparator;
 DecimalSeparator:='.';
 s:=StringReplace(Edit1.Text,',','.',[]);
 if tryStrToFloat(s,d) then
    caption:=Format('%f',[d])
 else
    caption:='Это не число';
 DecimalSeparator:=c;
end;
Ну в общем в таком ключе.
как грится лучче перебдеть чем недобдеть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать какой декомпрессор требуется для видео? Stilet Софт 13 01.06.2009 19:41
Как можно узнать какой объем озу и процессорную частоту поддерживает материнская плата Berzhan Компьютерное железо 10 01.06.2009 19:22
Как программно узнать не является ли слово в строке числом? SkAndrew Общие вопросы Delphi 10 07.05.2008 13:03
Как узнать с какого по какой адрес занимает процесс в системе. kalexi Win Api 2 30.03.2008 15:48
Как узнать какой сегодня день недели? Рустам Общие вопросы Delphi 9 05.09.2007 17:04