Другие причины для EConvertError с StrToFloat () в приложении Delphi 6? - PullRequest
3 голосов
/ 27 марта 2012

У меня странная проблема, которая затрагивает, по крайней мере, некоторых из моих международных пользователей моего приложения Delphi 6.Вот сценарий:

  • Моя программа периодически запрашивает отчеты о состоянии с внешнего устройства, которое действует как HTTP-сервер.
  • Устройство отправляет обратно отчет о состоянии в качестве документа ответа, который имеетполя серии, разделенные символом канала в формате пары «имя-значение» (например, - field1 = -0,437).
  • Я разбил строку отчета на поля и затем снова, чтобы получить каждое имя поля и числовое значение.
  • Я использую StrToFloat () для преобразования значений поля с плавающей запятой в формат string и присваиваю результат этой функции переменной Variant .

Это прекрасно работает на большинстве ПК, но некоторые из моих международных пользователей получают EConvertError's , когда я пытаюсь использовать StrToFloat () для числовых значений.Вот конкретный пример сообщения об ошибке из моих журналов:

EConvertError: '-0,685' не является допустимым значением с плавающей запятой

Как вы можете видеть -0,685 - это действительное число с плавающей запятой, но я получаю исключение EConvertError.Обычно я ожидал бы увидеть запятую с десятичной точкой или какую-то другую проблему с пунктуацией, зависящую от локали, но в этом случае число кажется хорошим.Кроме того, насколько мне известно, внешнее устройство даже не имеет возможности установить набор символов.

Итак, какой тонкий нюанс в Delphi 6 и международных наборах символов может вызывать эту проблему, возможно, связанную спользовательские настройки Windows XP / Win7?Обратите внимание, что я использую стандартные строки преобразования Delphi 6 " string " во всей моей программе, поэтому я не понимаю, как проблема с многобайтовым набором символов может быть основной причиной.Кто-нибудь имел эту проблему и знает, что с этим делать?

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Ваш удаленный пользователь ожидает , для десятичного разделителя. Когда встречается ., возникает исключение EConvertError. На машине, которая ожидает , в качестве десятичного разделителя (например, в большинстве стран Европы и Южной Америки), -0.685 действительно не является допустимым значением с плавающей запятой.

Обычно я ожидал бы увидеть запятую с десятичной точкой или какую-то другую проблему с пунктуацией, зависящую от локали, но в этом случае число кажется хорошим.

Ваша текущая проблема - только обратная сторона вышеупомянутой проблемы. Обычно, поскольку в вашей локали используется . в качестве разделителя, вы привыкли видеть проблемы, когда вместо них используются данные с ,. Поставьте себя на место кого-то из страны, которая использует , в качестве разделителя. Для них они привыкли видеть исключения, когда используются данные с ..


Эту проблему можно решить, нормализовав ввод с использованием того же десятичного разделителя, что и языковой стандарт машины. На современном Delphi вы можете решить эту проблему, используя перегрузку StrToFloat, которая получает параметр TFormatSettings, и явно указать, что . должен использоваться в качестве десятичного разделителя для этого преобразования. К сожалению, эта возможность недоступна в Delphi 6.

1 голос
/ 28 марта 2012

Я столкнулся с этой проблемой для бельгийских пользователей.Мне также пришлось вручную заменить «.»или ',' во входных данных.Кроме того, если вы вставляете данные в базу данных (sql), вам придется заменить ',' на '.'при вставке данных в базу данных .

...