Форум: "Начинающим";
Текущий архив: 2012.06.03;
Скачать: [xml.tar.bz2];
Внизпроблема с десятичным разделителем в дробях Найти похожие ветки
← →
Сергей (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c