Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизГлюки с 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c