Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.01;
Скачать: CL | DM;

Вниз

Глюки с decimal separator ом   Найти похожие ветки 

 
Franzy ©   (2003-08-17 12:37) [0]

Дядя Борман не устает меня удивлять. На сей раз мой удивление вызвало то, как дельфи обращается с decimal separator, по-нашему, со знаком отделения десятичной части. Глюки возникают потому, что у них этот знак - точка, а у нас - запятая.
Вот такие два примера. Берем edit. Делаем такой финт ушами: edit.text:=floattostr(pi);
в поле появится значенеи пи: 3,14159... И сколько-то там еще знаков после ЗАПЯТОЙ.
Дальше делаем так:
val(edit.text,x,ErrorCode);
Вы думаете в х будет занесено значение пи? Отнюдь. Там будет ровно 3. А ErrorCode будет равен номеру "offending character", в данном случае 2, то есть дельфи не устраивает запятая, ему точку подавай :)
Вот такая байда с региональными стандартами :) Дельфи сам путается, в каком стандарте числа записывать.

В связи с чем я это пишу... Как с этой дрянью бороться?
Я делаю так: перед применением val вставляю:

index.text[pos(index.text,",")]:=".";

Но это решение человека, который 5 лет кодил на паскале и только месяц назад перешел на Дельфи. Может, маститые мастера подскажут лучший путь, связяанный с использованием расширенных (по сравнению с паскалем) синтаксическими и программными возможностями Дельфи, или с хитрыми настройками компилятора (настройки региональных стандартов не предлагать :))


 
Просто случайный   (2003-08-17 12:47) [1]

На свой сеанс назнать нужный тебе DecimalSeparator (предварительно запомнив усстановленный по умолчанию), а окончании сессии (программы) верни все на круги своя. Лично я это делаю таким образои


 
Anatoly Podgoretsky ©   (2003-08-17 12:54) [2]

Не надо бочку катить на дядю Френка
На Val не распространяется действие региональных настроек, а распространяется оно на FloatToStr


 
Юрий Зотов ©   (2003-08-17 13:05) [3]

> Franzy © (17.08.03 12:37)
> Дядя Борман не устает меня удивлять.

Меня тоже. Тем, насколько хорошо он все продумал.
X := StrToFloat(Edit.Text);
И все будет по региональным установкам. И не надо менять DecimalSeparator/

> Дельфи сам путается
Путается. Но не Delphi.
:о)

> Просто случайный (17.08.03 12:47) [1]

И появляется реальный шанс нарваться на ошибку при обмене данными с другими программами. Например, при выгрузке в Excel.


 
pasha_golub ©   (2003-08-17 13:06) [4]

Будьте последовательны, если уж Вы используете floattostr, то в обрантую сторону используйте strtofloat

2Просто случайный
Некрасиво так делать, ИМХО


 
Anatoly Podgoretsky ©   (2003-08-17 13:15) [5]

Ой как некрасиво


 
Franzy ©   (2003-08-17 15:02) [6]

Просто все дело в том, что val мне нравится больше, чем strtofloat, поскольку в последнем случае можно нарваться на рантайм еррор, если юзер введет в поле не число, а абракадабру, и надо делать error handling. В Val эта обработка ошибок уже "зашита". Поэтому и использую в одну сторону val, а в другую - smthtostr.

> 2 Просто случайный
Ваш вариант мне нравится больше всего :) Если нет обмена с другими приложениями, почему бы его не использовать?
А менять как? Просто делая decimalseparator="."; ?

> 2 Анатолий
Меня возмущает именно этот факт, что в одном случае используется региональный стандарт, а в другом - нет. Я понимаю, что это сделано для совместимости со старыми версиями... Впору просто функции переопределять :)

> 2 Юрий и Павел
См. выше, почему использую именно Val. Защита против дураков...


 
Anatoly Podgoretsky ©   (2003-08-17 15:19) [7]

Franzy © (17.08.03 15:02) [6]
А тебя не смущает, что в одном случае используется Integer, string, byte?
Что одни функции,а другие процедуры?
Защита от дураков обеспечивается с помощью try except end, а не с помощью неподходящих функций. Или же пишется своя функция, более подходящее под условие под условие, никто к том же не запещает в ней скрыть try except end и сделать ее почти совместимой с VAL, которая кстати не является функцией, а так называемой комьютерной магией, вместо этой функции компилятор подставляет одну из нескольких, в зависимости от параметров. И работать она должна точно также, как работала и 20 лет назад иначе полетят все программы на ее основе. А для новых программ предназначены StrToXXX и другие. Так что переопределять нельзя.
У тебя наез на дядю от недостатка опыта, со временем научишься обижаться на самого себя.

Едиственно чем я не вполне удовлетворен, так это тем, что в справке могли бы подчеркнуть выше указанные факты. По поводу псевдо процедуры и региональных настроек, как это сделано для StrToFloat


 
Anatoly Podgoretsky ©   (2003-08-17 15:20) [8]

Будь добрее к Френку


 
olookin ©   (2003-08-17 17:40) [9]

есть такая переменная DecimalSeparator в самой дельфе. Я в этом случае при запуске программы (на OnCreate главной формы) просто пишу DecimalSeparator:="." - и в дальнейшем работаю в программе с нею... Естественно и все остальные функции/процедуры воспинимают точку как валидный разделитель...


 
Palladin ©   (2003-08-17 17:47) [10]


> olookin © (17.08.03 17:40) [9]

А по твоему речь о чем идет? Или ты так... о своем...


 
Anatoly Podgoretsky ©   (2003-08-17 17:53) [11]

olookin © (17.08.03 17:40) [9]
Ты голову можешь дать на отсечение насчет остальных функций?
Твоя то чем будет от "остальных" отличаться, такая же точно, насилие и проблемы польхователю.


 
Просто случайный   (2003-08-17 18:44) [12]

2 Anatoly Podgoretsky © (17.08.03 12:54) [2]
<На Val не распространяется действие региональных настроек, а распространяется оно на FloatToStr>
Ой как даже распостраняется на Val
Легко проверить


 
Anatoly Podgoretsky ©   (2003-08-17 19:23) [13]

@@dotExp:
CMP BL,"." - "0"
JNE @@exp


 
Mixa4 ©   (2003-08-17 22:25) [14]

а если еще глянуть как сделаны StrToXXX, можно обнаружить интерестные процедурки TryStrToXXX, позволяющие избежать громоздких блоков try ... except !!!


 
Просто случайный   (2003-08-17 23:02) [15]

ГДЕ ПРОБЛЕМЫ???
"Высвитете" и тогда будем сообща решать


 
Palladin ©   (2003-08-17 23:09) [16]

Как где. Вон там, наверху, в самом первом посте.


 
Anatoly Podgoretsky ©   (2003-08-17 23:15) [17]

Я же не зря привел кусок кода из RTL, который отвечает за разделитель, там видно жестко закодированая точка. Это из Д7, но тоже самое вроде и в Д7 и вряд ли когда либо изменится, поскольку многое рухнет.


 
Просто случайный   (2003-08-17 23:44) [18]

Извините, я в своем проекте (через не скажу какое место) позволяю пользователю вводить информацию в Edit, а дальше мои проблемы (программера), чтобы его понять, и не выдать runtime Error. Поэтому не совсем понимаю ни Podgoretsky, ни Palladin.
Уж извините


 
Anatoly Podgoretsky ©   (2003-08-18 00:14) [19]

Никаких runtime Error, если ты обратил внимание то рекомендуется использовать try except end, а вот пользователи очень благодарны, что их не привязывают к формату программиста, ему оно виднее и программа работает при любой локализации, но как только они попадают на диктат со стороны программиста, то они зверско ругаются, а им приходится работать с кучей программ и делать простой перенос, через буфер из одной в другую, например в Эксель.


 
Palladin ©   (2003-08-18 01:06) [20]

Парни, все что вас не устраивает в функциях и процедурах дяди Бормана, вы можете тут же подправить, реализовав свои версии. Благо, Паскаль вещь гениальная, и позволит если и не все, то многое. Вот только устроят ли ваши решения пользователей, да и вас самих? Устроит, ради бога. Не устроит, головняки обеспечены.
Ну а, извините меня, "3,14" обрабатывать при помощи Val, дык это сам бог велел ткнуть носом в книгу, да посильней, чтоб больше не хотелось возвращатся к этому методу обучения.



Страницы: 1 вся ветка

Текущий архив: 2003.09.01;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
7-1686
Jumbo
2003-06-17 04:52
2003.09.01
Microsoft Help Workshop


4-1702
Dan
2003-07-03 16:36
2003.09.01
Подскажите по использованию DrawText


1-1430
veb
2003-08-16 14:13
2003.09.01
Контейнер компонета


1-1395
imp403
2003-08-16 13:01
2003.09.01
Handles


1-1399
ASt
2003-08-16 01:38
2003.09.01
Много однотипных компонентов