![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StrToFloat()
a101081 © (2011-11-12 15:47:00)Здорово всем! У меня вопрос такого плана. Никогда с этим не сталкивался и не могу понять где хоть искать. Вот в чем проблема! У меня есть функция преобразования строки в десятичное число, выглядит она следующим образом:
function StrToFloat2(const S: string):real;
var
i:integer;
begin
if s='' then begin
Result:=-1;
exit;
end;
for I :=1 to Length(S) do
begin
if not (S[I] in ['0'..'9',',']) then begin
Result:=-1;
exit;
end;
end;
Result:=StrToFloat(s);
end;
Все работает (10 компов), но вот на 3-х компьютерах все ровно выдает ошибку плана:
'3,70' is not a valid floating point value.
То есть я уже перевожу строковый формат с запятой...
Вот не могу понять... в чем может быть проблема??? 3,70 - это же типичный REAL... Пробовал менять на точку как разделитель. но тоже самое...
Помогите! Очень надо!!!
Везде системы одинаковые XP (установлены может быть и с разных установочных дисков), но системы Windows XP везде...
Может быть какой библиотеки не хватает???
KilkennyCat (2011-11-12 21:39:00) [21]
> Inovet © (12.11.11 20:19) [25]
да вроде вовремя... сухо :)
Inovet (2011-11-12 20:19:00) [22]> [24] KilkennyCat © (12.11.11 20:11)
> я аж проснулся.
Воремя проснулся? не успел все шаги проделать во сне?
KilkennyCat (2011-11-12 20:11:00) [23]
> a101081 © (12.11.11 16:14) [11]
>
> 1. Зайдите в ПУСК
> 2. Выберите "Настройка"
> 3. Выберите "Панель управления"
> 4. Выберите "Язык и региональные стандарты"
> 5. Во вкладке "Региональные параметры" нажмите кнопку "Настройка"
> 6. В поле "Разделитель целой и дробной части" поставьте
> "запятую" (,)
> 7. Нажмите "ОК"
я аж проснулся.
Anatoly Podgoretsky (2011-11-12 18:06:00) [24]ShowMessage(FloatToStr(3.7))
И результат в студию
Inovet (2011-11-12 17:19:00) [25]> [20] a101081 © (12.11.11 16:56)
> я отвечу - поменяй там-то...
> по умолчанию у всех на винде стоит запятая!
Не у всех. Представь теперь ещё одного такого же ленивого программиста, но он в своей программе точку ожидает, и тоже позвонил пользователю и сказал поменять запятую на точку. А пользователю вообще привычнее там видеть пацифик.
Dennis I. Komarov (2011-11-12 17:02:00) [26]
> по умолчанию у всех на винде стоит запятая! а если сам ползал.
> то поймет, из-за чего!!!
С чего это? В англицкой по умолчанию точка. И потом это святое право пользователя, поставить себе то, что ему удобно. А твоя святая обязанность, как программиста, сделать так, чтобы работало корректно.
Поэтому [8]
a101081 (2011-11-12 16:56:00) [27]ну значит напишет о своей проблеме! я отвечу - поменяй там-то...
по умолчанию у всех на винде стоит запятая! а если сам ползал. то поймет, из-за чего!!!
Dennis I. Komarov (2011-11-12 16:35:00) [28]
> В том-то и дело, что перед этой процедурой сначало я меняю
> все точки на запятые... а уж потом только преобразую строку
> в число
Сказал же, бить будут... Завтра найдется еще один такой умник с "-" разделителем и всем поменяет...
Dennis I. Komarov (2011-11-12 16:33:00) [29]
> Inovet © (12.11.11 16:13) [10]
Мне было интерестно не Ваше мнение ;)
Inovet (2011-11-12 16:32:00) [30]> [16] a101081 © (12.11.11 16:30)
> В том-то и дело, что перед этой процедурой сначало я меняю
> все точки на запятые...
Вот это и неправильно. А если у пользователя точка разделитель?
a101081 (2011-11-12 16:30:00) [31]
> Программа должна с любой локалью работать праввильно, а
> ты уже "," жёстко закодировал.
>
> Если это чтение из файла некоторого оговорённого формата,
> где разделитель всегда ",", . Пользуйся этой функцией:
> function StrToFloat(const S: string; const AFormatSettings:
> TFormatSettings): Extended;
В том-то и дело, что перед этой процедурой сначало я меняю все точки на запятые... а уж потом только преобразую строку в число
Inovet (2011-11-12 16:27:00) [32]> [11] a101081 © (12.11.11 16:14)
> Может кто-нибудь проверить?
Программа должна с любой локалью работать праввильно, а ты уже "," жёстко закодировал.
Если это чтение из файла некоторого оговорённого формата, где разделитель всегда ",", . Пользуйся этой функцией:
function StrToFloat(const S: string; const AFormatSettings: TFormatSettings): Extended;
Dennis I. Komarov (2011-11-12 16:25:00) [33]
> a101081 © (12.11.11 16:14) [11]
За такой подход к стенке и ногами...
> дело в том, что у меня не может быть в программе отрицательных!
> !! 100%!!! Поэтому я и написал такую вот функцию... Мне
> достаточно. Я потом просто проверю, если возвратит -1 то
> я буду одно делать, а если что-то другое - значит все хорошо!
> Можно работать дальше!!
хозяин - барин, только ректально все это.
Dennis I. Komarov (2011-11-12 16:21:00) [34]
> В том то и дело, что функция будет отсекать левые символы
> которые не 0...9 и запятая... А если что-то попадется то
> ответом будет -1!!!
> Как такое возможно??? На всех компах работает, но вот на
> 3 не пашет.... из-за чего?
Тогда причем тут некое строковое представление и "floating point value"
a101081 (2011-11-12 16:17:00) [35]
> Я ему верю... да и врать он не умеет
>
> StrToFloat2('-1')
> StrToFloat2('-2')
> корректно?
дело в том, что у меня не может быть в программе отрицательных!!! 100%!!! Поэтому я и написал такую вот функцию... Мне достаточно. Я потом просто проверю, если возвратит -1 то я буду одно делать, а если что-то другое - значит все хорошо! Можно работать дальше!!
a101081 (2011-11-12 16:14:00) [36]1. Зайдите в ПУСК
2. Выберите "Настройка"
3. Выберите "Панель управления"
4. Выберите "Язык и региональные стандарты"
5. Во вкладке "Региональные параметры" нажмите кнопку "Настройка"
6. В поле "Разделитель целой и дробной части" поставьте "запятую" (,)
7. Нажмите "ОК"
Вот что думается поможет... Только вот пока не проверить... Только завтра буду дома. А так хочется узнать сработает ли???? Может кто-нибудь проверить?
Поменять на точку и запустить функцию... Потом обратно махнуть на запятую...
Inovet (2011-11-12 16:13:00) [37]> [7] Dennis I. Komarov © (12.11.11 16:06)
> А я вот нет, может расскажешь?
Ошибку он хочет получить при лидирующих не числовых символах. Только почему ошибка -1 кодируется, и почему не обрабатываются все возможные начальные символы строкового представления числа с плавающей точкой.
Inovet (2011-11-12 16:11:00) [38]> [6] я (12.11.11 16:04)
> функция StrToFloat(S: String): Extended
real устаревший тип. Надо пользоваться: float, double, extended.
Dennis I. Komarov (2011-11-12 16:08:00) [39]DecimalSeparator + F1
Dennis I. Komarov (2011-11-12 16:06:00) [40]
> '3,70' is not a valid floating point value.
Я ему верю... да и врать он не умеет
StrToFloat2('-1')
StrToFloat2('-2')
корректно?
З.Ы.
TryStrToFloat + F1
> я (12.11.11 15:52) [2]
> а понял :-)
А я вот нет, может расскажешь?