Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3

Странности с StrToFloat(ToDouble()

31.08.2022, 17:41. Показов 3711. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго.

Наткнулся на супер странность, по крайне мере для меня....
Есть у меня клиентская служба, которая установлено >5000 ПК, и вот только где ПК является сервером под управлением Windows (и еще не сколько клиентских), служба сыпалась.

Оказалось что, на этих ПК не работаем следующий код:

C++
1
2
    String rezult = "3,88";
    double t1 = StrToFloat(rezult);
А работает только так
C++
1
2
    String rezult = "3.88";
    double t1 = StrToFloat(rezult);
Когда на большинство ПК обратная реакция.
Я даже хз из за чего такое может быть, и как с этой мелочевкой правильно поступить
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2022, 17:41
Ответы с готовыми решениями:

Конвертация ToString в ToDouble
Есть код x3 = Convert.ToDouble(textBox9.Text); y3 = Convert.ToDouble(textBox10.Text); z3 = ((((x3...

Convert::ToDouble | textBox1->Text | Ошибка
На форме есть текстовое поле. В него я ввожу дробовое число. При нажатии на кнопку возникает ошибка. Код кнопки: double...

Не работает Convert.ToDouble на другой машине
Здравствуйте. Пишу код на win10 x32, VS2019 .NET 4.5. Когда перекидываю на win7 x64 или на win server 2016, прога доходит до строчки с...

22
 Аватар для Lelik-pahan
1709 / 905 / 207
Регистрация: 25.11.2009
Сообщений: 1,858
02.09.2022, 23:22
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dinkin Посмотреть сообщение
Из предложенных ссылок, я увидел что народ просто реплейсит в слепую, что то да подойдет, но тогда все равно нужно try_catch делать, так как я заранее не знаю какой формат.
Как раз FormatSettings.DecimalSeparator (в старых билдерах просто DecimalSeparator) и позволяет узнать какой формат в системе.

Цитата Сообщение от Dinkin Посмотреть сообщение
if(TryStrToFloat(rezult,i))
        i = rezult.ToDouble();
            else
                {
                    if(size.Pos("."))
                        rezult = StringReplace(rezult,".",",",TReplaceFla gs()<<rfReplaceAll);
                            else
                                rezult = StringReplace(rezult,",",".",TReplaceFla gs()<<rfReplaceAll);
i = rezult.ToDouble();
                }
Зачем такие заморочки? Если хотим делать проверку:
C++
1
2
3
4
5
6
7
8
9
double StrToDouble(String s)
{
    if (FormatSettings.DecimalSeparator == '.')
        s = StringReplace(s, ",", ".", TReplaceFlags() << rfReplaceAll);
    else  //FormatSettings.DecimalSeparator == ','
        s = StringReplace(s, ".", ",", TReplaceFlags() << rfReplaceAll);
 
    return s.ToDouble();
}
варианты с экзотическими разделителями вроде '=' не рассматривал
если хотим решение "в лоб":
C++
1
2
3
4
5
6
7
double StrToDouble(String s)
{
    s = StringReplace(s, ",", FormatSettings.DecimalSeparator, TReplaceFlags() << rfReplaceAll);
    s = StringReplace(s, ".", FormatSettings.DecimalSeparator, TReplaceFlags() << rfReplaceAll);
 
    return s.ToDouble();
}
Второй подход - не подстраиваться под настройки системы пользователя, а работать в программе "со своим" десятичным разделителем.
В конструкторе один раз вызываем:
C++
1
FormatSettings.DecimalSeparator = ',';  //или '.'
Важным является то, что изменение будет локальным - только для нашей программы (на время её работы).
Это никак не повлияет на работу других программ и нет необходимости возвращать прежние настройки назад.


И кстати, если TryStrToFloat выполняется успешно, то результат будет записано во второй аргумент.
Т. е. после
C++
1
if (TryStrToFloat(rezult, i))
не нужно выполнять
C++
1
i = rezult.ToDouble();
Вернее будет такая конструкция
C++
1
2
3
4
5
6
    double i;
    if (!TryStrToFloat(rezult, i))
    {
        //здесь наши хитрые манипуляции
    }
    return i;
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
02.09.2022, 23:42
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
и нет необходимости возвращать прежние настройки назад
Лучше по окончании работы приложения вернуть, были заморочки.
0
 Аватар для Intel4004
10 / 10 / 0
Регистрация: 27.04.2015
Сообщений: 39
05.09.2022, 13:04
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Extended String_ToFloatDef (AnsiString S, Extended Default)
{
int Pos;
AnsiString Delimiter = ".,";
if (!S.IsEmpty())
  {
  while ((Pos = Delimiter.Pos(DecimalSeparator)) != 0)
    Delimiter.Delete(Pos,1);
  while ((Pos = S.LastDelimiter(Delimiter)) != 0)
    S[Pos] = DecimalSeparator;
  }
try
  {
  return StrToFloat(S);
  }
catch (EConvertError &E)
  {
  return Default;
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2022, 13:04

FormatException при использовании Convert.ToDouble
Непонимаю. Нашел такой же пример в MSDN.

Convert::ToDouble(textBox1->Text) независимость от региональных настроек
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { double D; D =...

Convert.ToDouble: Входная строка имела неверный формат
Не понимаю в чем тут дело, в цикле работает, а на if (Convert.ToDouble(dgv.Rows.Cells.Value) &lt; 0) выдает ошибку Входная строка имела...

Входная строка имела неверный формат при Convert.ToDouble
Ввожу число, затем нажимаю &quot;+&quot; и в строке a = Convert.ToDouble(Output.Text); вылетает исключение: Входная строка имела неверный формат. ...

Записать через TextBox, Label (x = Convert.ToDouble(Console.ReadLine();)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru