Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 330

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Некоторые приложения, подготовленные ранее, не работают, система выдает сообщение: ’34.0314’ is not valid floating point value. Подозреваю, что связано это с десятичным разделителем, но когда и где изменились настройки не знаю. Пробовал в коде программы изменять тип разделителя ( DecimalSeparator := ','; ), но этот вариант не всегда возможен, кроме того, в одном случае помогает, в другом - нет. Помогите, пожалуйста, устранить возникшее неудобство.

Драганов Василий Михайлович Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Драганов Василий Михайлович (статус: Посетитель)
Вопрос отправлен: 27 мая 2011, 19:59
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Драганов Василий Михайлович!
Я считаю, что требовать от пользователя вводить только точку или только запятую - невежливо/ У каждого свои убеждения и предпочтения. Поэтому лучше написать свою функцию MyStrToFloat где то такого вида:

function MyStrToFloat(s:string):float;
var i:integer;
begin
  // прежде всего удалим пробелы в начале и конце
  // некоторые люди любят их ставить для красоты
  s := trim(s);
  if length(s) = 0 then begin
    result := 0;
    Showmessage('К сожалению, пустая строка не является числом, но мы будем считать это нулем.');
    exit;
  end;
  // а теперь пробежим по всем символам и заменим точки и запятые 
  // на "правильный" разделитель
  for i := 1 to length(s) do
    if (s[i] = ',') or (s[i] = '.') then s[i] := DecimalSeparator;
  // а теперь преобразуем, но с хитростью
  if not TryStringToFloat(s, result) then begin
    // не получилось преобразовать.
    // вернем к примеру 0
    result := 0;
    // и ошибочку покажем
    Showmessage('Введенное число '+s+'не удалось преобразовать известными методами');
  end;
end;
Showmessage можно заменить на вывод в лог или на что то более удобоваримое ( а может и вовсе убрать).
А вот подменять в своей программе DecimalSeparator я бы не советовал. Многие функции внутри полагаются на него и может привести к трудно отлаживаемым феерическим багам (когда одно и тоже число то преобразовывается, то нет).

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 27 мая 2011, 23:58
Оценка за ответ: 5

Комментарий к оценке: Вадим, большое спасибо за развёрнутую подсказку! Уже в который раз Вы меня выручаете! :)

Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 29 мая 2011, 20:54; участников в обсуждении: 5.
bugmenot

bugmenot (статус: 3-ий класс), 27 мая 2011, 20:40 [#1]:

Цитата (Драганов Василий Михайлович):

Подозреваю, что связано это с десятичным разделителем

Совершенно верно.

Цитата (Драганов Василий Михайлович):

где изменились настройки

В "Региональных стандартах", настройки локали считываются при старте приложения и при применении изменений.

Цитата (Драганов Василий Михайлович):

DecimalSeparator := ','

Судя по сообщению - надо точку, а не запятую. И присваивать как можно раньше, в коде проекта, до создания форм.

Цитата (Драганов Василий Михайлович):

в одном случае помогает, в другом - нет

Это - загадочно, надо море инфо.
виконання програми розпочинається з того самого мiсця, де призупинилося.

Драганов Василий Михайлович

Драганов Василий Михайлович (статус: Посетитель), 27 мая 2011, 20:54 [#2]:

Ввод чисел производится как в ячейках типа Edit или им подобным, так и из Excel-таблиц.Похоже, что разделители там разные.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 27 мая 2011, 21:17 [#3]:

Цитата (Драганов Василий Михайлович):

.Похоже, что разделители там разные.

это точно. Надо выяснить где конкретно возникает ошибка. Для этого есть Debugger. Как правило, такая ошибка возникает при вызове StrToFloat
DNK

DNK (статус: Студент), 28 мая 2011, 00:14 [#4]:

Цитата:

if (s[i] = ',') or (s[i] = ',') then s[i] := DecimalSeparator;
Вадим К: Наверное в одном из случае в подразумевалась точка.
"Digital Networked Knight"
Вадим К

Вадим К (статус: Академик), 28 мая 2011, 00:25 [#5]:

наверное:)
Галочка "подтверждения прочтения" - вселенское зло.
Драганов Василий Михайлович

Драганов Василий Михайлович (статус: Посетитель), 28 мая 2011, 08:30 [#6]:

Спасибо всем экспертам, откликнувшихся на призыв о помощи!!!

28 мая 2011, 08:32: Статус вопроса изменён на решённый (изменил автор вопроса — Драганов Василий Михайлович)

28 мая 2011, 10:42: Вопрос перемещён из тематического раздела Разные вопросы в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.

bugmenot

bugmenot (статус: 3-ий класс), 29 мая 2011, 20:54 [#7]:

Цитата (Вадим К):

требовать от пользователя вводить только точку или только запятую - невежливо/ У каждого свои убеждения и предпочтения.

Смайлик потерялся, а так - хорошая шутка.
Спойлер: $1,024.67
виконання програми розпочинається з того самого мiсця, де призупинилося.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.