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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2010, 15:13   #1
Detka.i.alex
Пользователь
 
Регистрация: 02.08.2010
Сообщений: 16
По умолчанию TRegExpr парсинг числа и перевод во float

Добрый день.
У меня есть строка
Код:
N100 X10.000 Z47.450
Ну вырезать эти цифры я смог, но у них тип не тот который мне нужен, а нужен мне float.

Кусочек кода:

Код:
RegN->Expression="[N][0-9]{3}";
RegN->Exec(memoline[0]);
RegX->Expression="[X]([0-9]+[.][0-9]{3})";
RegX->Exec(memoline[0]);
RegZ->Expression="[Z]([0-9]+[.][0-9]{3})";
RegZ->Exec(memoline[0]);
String N=RegN->Match[0];
String X=RegX->Match[1];
String Z=RegZ->Match[1];

После пытаюсь сделать это:
Код:
float a=StrToFloat(Z);
В ответ получаю ошибку что значение не float... Хотелось бы услышать ваше решение этой проблемы.
Спасибо.
P.S. Это c++ Builder.
Detka.i.alex вне форума Ответить с цитированием
Старый 03.08.2010, 09:09   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я думаю, что у Вас десятичный разделитель в системе установлен другой. Например, запятая...

проверьте, что у Вас фактически находится в Z
попробуйте написать так:
Код:
Z = "47.450";
float a=StrToFloat(Z);
так работает?
а так?
Код:
Z = "47,450";
float a=StrToFloat(Z);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.08.2010, 13:44   #3
Detka.i.alex
Пользователь
 
Регистрация: 02.08.2010
Сообщений: 16
По умолчанию

Так уже пробывал. С точкой работает а с запятой нет. Но всё равно то значение которое я парсю выдаёт ошибку 8(
Detka.i.alex вне форума Ответить с цитированием
Старый 04.08.2010, 15:17   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

повторюсь.
любым доступным Вам способом перед выполнением оператора
float a=StrToFloat(Z);

сделайте вывод (а ещё лучше киньте полученное значение в Edit или в Memo или вообще в текстовый файл сохраните ) содержимого переменной Z
тогда будет повод о чём говорить!
(я лично думаю, что там будет совсем не то, что Вы ожидаете.. Скорее всего - пустая строка... почему?.. Для этого надо видеть и исходные данные и код более полный... я, например, в вашем исходном коде вообще не вижу строчки float a=StrToFloat(Z); Может Вы её вообще в другом месте вызываете!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.08.2010, 15:42   #5
Dima_D
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 28
По умолчанию

подскажите пожалуйста можно ли парсить числа типа : xxx.xx.xx.xx:xxxx
Dima_D вне форума Ответить с цитированием
Старый 04.08.2010, 15:49   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Dima_D, можно.

Только правила форума не надо нарушать!
Не надо лезть в чужую тему со своими вопросами!
Создайте свою, там и задавайте вопросы.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.08.2010, 16:26   #7
Detka.i.alex
Пользователь
 
Регистрация: 02.08.2010
Сообщений: 16
По умолчанию

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String memoline[100];
//TRegExpr *RegN = new TRegExpr;
//TRegExpr *RegX = new TRegExpr;
TRegExpr *RegZ = new TRegExpr;
int count=Memo1->Lines->Count;
for(int i=0; i<=count-1; i++)
{
	memoline[i]=Memo1->Lines->Strings[i];
}
//RegN->Expression="[N][0-9]{3}";
//RegN->Exec(memoline[0]);
//RegX->Expression="[X]([0-9]+[./][0-9]{3})";
//RegX->Exec(memoline[0]);
RegZ->Expression="[Z]([0-9]+[.][0-9]{3})";
RegZ->Exec(memoline[0]);
//String N=RegN->Match[0];
//String X=RegX->Match[1];
String Z=RegZ->Match[1];
//Label1->Caption=N;
//Label2->Caption=X;
Label3->Caption=Z;
float a=StrToFloat(Z);
}
Вроде всё как и должно быть. Ввожу в мемо строку Z10.000 нажимаю кнопку вылетает ошибка :

Вставляю переменную Z в лейбл3 выводит 10.000.
Не понимаю что я не так делаю 8(
Detka.i.alex вне форума Ответить с цитированием
Старый 04.08.2010, 16:29   #8
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Есть такая переменная, как DecimalSeparator.
Чтобы заставить StrToFloat работать с точкой надо в Form.OnCreate написать
DecimalSeparator = '.';
для запятой - DecimalSeparator = ',';
Можно хоть слэш использовать.

Последний раз редактировалось ZaRDaK; 04.08.2010 в 16:36.
ZaRDaK вне форума Ответить с цитированием
Старый 04.08.2010, 17:10   #9
Detka.i.alex
Пользователь
 
Регистрация: 02.08.2010
Сообщений: 16
По умолчанию

Теперь буду знать. Спасибо за помощь.
Detka.i.alex вне форума Ответить с цитированием
Старый 04.08.2010, 18:31   #10
Dima_D
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 28
По умолчанию

подскажите где найти документацию.
Dima_D вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с TRegExpr zver777 Общие вопросы Delphi 3 11.05.2010 07:00
Перевод char во float в С. vitalyisaev2 Помощь студентам 1 07.05.2010 19:13
FLOAT TO TRING И STRING TO FLOAT!! MelKiY_bad C++ Builder 6 07.05.2010 14:31
Перевод пакетных данных в float число Serval Свободное общение 1 28.07.2009 12:52
Вывод float числа в поток cout IgorKr Общие вопросы C/C++ 7 30.05.2008 01:21