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

Вниз

проблема с десятичным разделителем в дробях   Найти похожие ветки 

 
Сергей   (2012-01-26 15:08) [0]

Всем добрый день. Помогите решить следующую проблему.

В моей программе пользователь вводит данные, использующиеся для дальнейших расчётов, в виде десятичных дробей с запятой в качестве десятичного разделителя (в расчётах использую тип real). Перед началом расчётов я делаю проверку, правильно ли пользователь ввёл данные (этот этап является принципиально важным). Делаю это с помощью процедуры val. Вот здесь у меня проблема.

Процедура говорит, что введённое число - не дробь, выдавая ошибку на запятой. Если в качестве разделителя использовать точку, то проверка проходит нормально, но введённое с точкой число нельзя использовать в расчётах, так как компилятор выдаёт ошибку "not a valid floating point value" (с запятой - всё ок).

Что нужно сделать с этим десятичным разделителем, чтобы и проверка проходила нормально, и число с ним можно было использовать для расчётов? От отчаяния пробовал делать SysUtils.DecimalSeparator:="." или ",", но это ни фига не дало (что не удивительно). Заранее благодарен.


 
RWolf ©   (2012-01-26 15:11) [1]


> введённое с точкой число нельзя использовать в расчётах

в каких?


 
Inovet ©   (2012-01-26 15:32) [2]

> [0] Сергей   (26.01.12 15:08)

StrToFloat()
И хранить для дальнейших расчётов не d текстом ajhvfnt а с плавающей точкой. Real выбросить и заменить на Double (Single, Extended).


 
MBo ©   (2012-01-26 15:33) [3]

Val -  подразумевает использование десятичной точки независимо от языковых установок.

(Try)(StrToFloat(Def)


 
Anatoly Podgoretsky ©   (2012-01-26 15:36) [4]

> Сергей  (26.01.2012 15:08:00)  [0]

Просто не проверять, а заменять запятую и точку (это минимум) на
DecimalSeparator


 
Anatoly Podgoretsky ©   (2012-01-26 15:37) [5]


> MBo ©   (26.01.12 15:33) [3]

Val -  подразумевает системно независимый формат


 
Dimka Maslov ©   (2012-01-26 18:05) [6]

Компилятору обычно всё равно, что ввёл пользователь. Поэтому так ругаться на пользовательский ввод он не может. А раз он всё-таки так ругается то дело не в vale и не в DecimalSeparatore.

На компьютере в региональных настройках указана запятая. Это приводит к тому, что некоторые приложения таки используют запятую при взаимном преобразовании строк и вещественных значений. Компилятор delphi, как узкоспециализированная программа, написанная по определённому стандарту, игнорирует эту настройку и всегда использует только точку. При этом работа программ, написанных на delphi целиком и полностью лежит на совести разработчика - будет он учитывать DecimalSeparator, или нет. Поэтому существуют несколько функций преобразования val/str, которые используют только точку и StrToFloat/FloatToStr, использующие DecimalSeparator.

Если для проверки используется val, а потом для преобразования StrToFloat, то и возникает исключение, а не ошибка компиляции. Надо правильно применять термины, чтобы не вводить других в заблуждение. Методы борьбы:
a) Если мы хотим, чтобы была точка:
1) использовать val как для проверки, так и для преобразования (да, это можно и нужно делать) 2) после проверки valом заменять введённую точку на DecimalSeparator
б) Если мы хотим, чтобы был DecimalSeparator:
a) использовать TryStrToFloat б) заменять в введённом тексте DecimalSeparator на точки и использовать Val для преобразования и проверки.


 
Дмитрий Белькевич   (2012-01-26 20:25) [7]


> Перед началом расчётов я делаю проверку, правильно ли пользователь
> ввёл данные (этот этап является принципиально важным).


С точки зрения юзабилити лучше не делать проверку, а не давать вводить лишнего.


 
Anatoly Podgoretsky ©   (2012-01-26 21:21) [8]

Лучше не проверять, но и не запрещать. Многие люди вводят числа на цифровой клавиатуре, а там все зависит от текущей локали, то ли это будет точка, то ли запятая.



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

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

Наверх




Память: 0.49 MB
Время: 0.007 c
2-1327842847
Alex_C
2012-01-29 17:14
2012.06.03
Считать текстовый файл с диска


2-1327592362
whoim
2012-01-26 19:39
2012.06.03
Ищу подходящий компонент: матрица, квадраты


2-1327835060
Gu
2012-01-29 15:04
2012.06.03
переделать компонент под xe2 x64


15-1328387403
Юрий
2012-02-05 00:30
2012.06.03
С днем рождения ! 5 февраля 2012 воскресенье


15-1326538361
xayam
2012-01-14 14:52
2012.06.03
База данных совместимости чернил/картриджей/принтеров