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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StrToFloat(), Чтоб работал и с «,», и с «.» 
:(
    Опции темы
Diesel Draft
Дата 7.2.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



Чувствую себе полным нубом. 
И так ситуация: я использую StrToFloat() , но входная строка не всегда формату “aa,bb”, а иногда “aa.bb”. Я не хочу заменять реплейсом знак. Я помню что была функция которая отключала это во всей винде и позволяла пользуватся «,» и «.»
Помогите вспомнить пожалуйста. 



--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Sunvas
Дата 7.2.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Поиск по форуму DecimalSeparator!
Вот, чтобы долго не мучался.
http://forum.vingrad.ru/topic-61562.html


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
MetalFan
Дата 7.2.2007, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



AFAIK, DecimalSeparator может быть только один в системе. либо "." либо "," либо другой знак...



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



Цитата

Я не хочу заменять реплейсом знак


Я всегда пользуюсь поиском  smile 

надо будет порытса внутри  smile 


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Sunvas
Дата 7.2.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(Diesel Draft @  7.2.2007,  01:00 Найти цитируемый пост)
Я всегда пользуюсь поиском

Посмотри внизу. Там много-много похожих тем.



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Diesel Draft
Дата 7.2.2007, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



смотрел  smile 


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Snowy
Дата 7.2.2007, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Код

  s := StringReplace(s, ',', DecimalSeparator, rfReplaceAll);
  s := StringReplace(s, '.', DecimalSeparator, rfReplaceAll);
  r := StrToFloatDef(s, 0);

PM MAIL   Вверх
ivan219
Дата 7.2.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ты номерное с типом Real работаешь случаем не в Edit smile 
Процедура для Edit событие OnCange можешь переделать под что хочешь приписав первые и последние две строчки. 
Код

{Процедура ограничения в вода в Edit с преобразованием '.' в ',' ('0..9',',','.','E','+','-')}
procedure EditCh(Sender:TObject);
const WrongSepArr : array[0..1] of char =('.',','); //создаём константу - массив для хранения символов, которые надо преобразовать в разделитель
Var
  CurStr: String;
  Counter,SelPos,SeparatorPos  :Integer;
begin
  SelPos:=TLabeledEdit(Sender).SelStart; //положение курсора
  CurStr:=TLabeledEdit(Sender).Text;//Текст из Edit, который изменён
  if CurStr='' then //Если текста нет
   begin
    TLabeledEdit(Sender).Text:='0';     //Поставить 0
    TLabeledEdit(Sender).SelStart:=1;   //Отвести курсор на 1
    Exit;          //Выйти
   end;
  for counter := 0 to 1 do  //Перечисление по массиву
   if WrongSepArr[counter]<> DecimalSeparator then
    while Pos(WrongSepArr[counter],CurStr)>0 do   //ищем данный элемент массива в тексте
     CurStr[Pos(WrongSepArr[counter],CurStr)]:=DecimalSeparator;//Заменяем на сепаратор
  SeparatorPos:=Pos(DecimalSeparator,CurStr); //Ищем первый сепаратор
  for Counter:= Length(CurStr) downto 2 do  //Перечисление по строке от конца до 2 элемента (обратный, т.к. может быть удалены символы и как следствие - уменьшена длина)
   begin
    if (curStr[Counter] in [DecimalSeparator])and(Counter=SeparatorPos) then //если сепаратор и он не первый
     curStr[Counter] := DecimalSeparator  //удаляем
    else
     if not (curStr[Counter] in ['0'..'9','E','e','-','+']) then    //иначе ели не разрешённый символ
      begin
       Delete(CurStr,counter,1);  //удаляем
       dec(SelPos); //Уменьшить на 1
      end;
  end;
  if (curStr[1] in [DecimalSeparator])and(SeparatorPos=1) then //Если первый знак . или , то поставить 0,
   begin
    curStr[1]:=DecimalSeparator;
    insert('0',curStr,0);
    inc(SelPos); //Увеличить на 1
   end;
  if (curStr[length(curStr)]='E')or(curStr[length(curStr)]='e') then //Если последний символ E
   Delete(CurStr,length(curStr),1);  //Удалить
  if (curStr[length(curStr)]='-')or(curStr[length(curStr)]='+') then //Если последний символ знак
   Delete(CurStr,length(curStr),1);  //Удалить
  if length(curStr)>=2 then //Если длина больше 1
   if (curStr[1] in ['+','-'])and(curStr[2] in [DecimalSeparator]) then  //Если первый символ знак
    begin
     insert('0',curStr,2); //Вставить 0 вторым символом
     inc(SelPos);  //Увеличить на 1
    end;
  if not (curStr[1] in ['0'..'9','+','-']) then   //Если первый символ запрещён
    Delete(CurStr,1,1); //Удалить
  while (length(curStr)>=2)and(curStr[1]='0')and(curStr[2]<>DecimalSeparator)do //удалить нули в начале числа
   delete(CurStr,1,1); //Удалить
  while (length(curStr)>=3)and(curStr[1]in['+','-'])and(curStr[2]='0')and(curStr[3]<>DecimalSeparator)do //удалить нули в начале числа, если первый символ - знак
   delete(CurStr,2,1); //Удалить
  TLabeledEdit(Sender).Text:=CurStr;  //Результат
  TLabeledEdit(Sender).SelStart:=SelPos;  //Результат
end;

Правда есть некоторые глюки, если выделить текст и нажать - то будет ошибка но я думаю это мелочь если избавишься отпишись.
PM MAIL ICQ   Вверх
Diesel Draft
Дата 9.2.2007, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

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



ivan219, Непонемаю к чему єто


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
ivan219
Дата 9.2.2007, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну как к чему эта процедура позволяет в водить только цифры в Edit ещё меняет . на , я так понятл что ты хочеш работать с типам Real вот и привёл пример smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 9.2.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



У меня винда русская и разделитель "," Указываю ему в качестве разделителя '.' и все срабатывает.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 c : extended;
begin
  Edit1.text := '3.14159265358979323846264338327950288';
  c := Strtofloat(Edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DecimalSeparator := '.';
end;


но это не дружественно по отношению к пользователям привыкшим везде писать ","

Это сообщение отредактировал(а) Alexeis - 9.2.2007, 12:11


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 9.2.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



я вот тоже всегда использую вариант, предложенный Snowy!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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