Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1654
Layner
2003-08-12 13:06
2003.09.01
Что зделали, что offline форум для мастаков от Nikkie


4-1735
sserge
2003-06-30 02:43
2003.09.01
Как изменить дату создания директории


4-1743
Antipich
2003-07-01 23:45
2003.09.01
Получение выделенного текста


14-1644
Best Guns
2003-08-12 14:18
2003.09.01
Куда делись все ветки?!


3-1299
yaric
2003-08-09 13:24
2003.09.01
Как можно упаковать таблицу Paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский