Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StrToFloat()


Страницы:   1 2 3

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]
> а понял :-)

А я вот нет, может расскажешь?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо