Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1327586372
Асм
2012-01-26 17:59
2012.06.03
Встроенный ассемблер в Delphi


15-1327515561
Псарь
2012-01-25 22:19
2012.06.03
Цикл AS3 -> Delphi цикл.


15-1328455559
uzer
2012-02-05 19:25
2012.06.03
Вопрос по N-кодеру/валкодеру и программы к нему


15-1327573619
>|<
2012-01-26 14:26
2012.06.03
Как правильно обновляться программу


2-1327842847
Alex_C
2012-01-29 17:14
2012.06.03
Считать текстовый файл с диска





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский