Главная страница
    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
2-1327950833
Max
2012-01-30 23:13
2012.06.03
Ошибки с Tstream


15-1328120761
upc
2012-02-01 22:26
2012.06.03
Форма, MainMenu, PopupMenu, глюк


15-1328106469
yurikon
2012-02-01 18:27
2012.06.03
Нужна помощь по COM объекту


2-1327567305
JohnKorsh
2012-01-26 12:41
2012.06.03
Позиционирование курсора в TMemo.


2-1327475787
Xmen
2012-01-25 11:16
2012.06.03
ExcelApplication1WorkbookBeforeClose не получается закрыт Excel





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