На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Конвертация строки в числовой
    Добрый день!

    Не могу найти способ конвертировать string в тип double. StrToFloat - не подходит, потому что мне нужно конвертировать с разделителем точка.

    Например

    ExpandedWrap disabled
      var
       s: string;
       d: double;
      begin
       s := 12.12345
       d := FloatToStr(s);


    выдает ошибку "is not a valid floating point value".

    Небольшое примечание, программа пишется под Android. Заранее большое спасибо!
    Сообщение отредактировано: BackUp -
      В справку, значит, не смотрел?

      http://docs.embarcadero.com/products/rad_s...oat@string.html
        Возможно вы имели ввиду этот код...
        ExpandedWrap disabled
          procedure TForm1.Button1Click(Sender: TObject);
          var
            newVal: Double;
            CurFamily: TConvFamily;
            FromType, ToType: TConvType;
          begin
            DescriptionToConvFamily(ComboBox1.Items[ComboBox1.ItemIndex], CurFamily);
            DescriptionToConvType(CurFamily, ListBox1.Items[ListBox1.ItemIndex], FromType);
            DescriptionToConvType(CurFamily, ListBox2.Items[ListBox2.ItemIndex], ToType);
            newVal := Convert(StrToFloat(Edit1.Text), FromType, ToType);
            ShowMessage(Format('%g %s', [newVal, ConvTypeToDescription(ToType)]));
          end;

        Но, у меня среда разработки Delphi 10. Он выдает мне новые ошибки((
          Второй вариант функции позволяет использовать набор установок, включающий нужный разделитель

          ExpandedWrap disabled
            function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;
            Не совсем понятно, какой второй вариант?
            ExpandedWrap disabled
              var
                s : string;
                d : Double;
              begin
                s := '22,767'; // У меня в системе разделитель - точка
                FormatSettings.DateSeparator:= '.';
                d:= StrToFloat(s);


            Попробовал, никаких изменений((
              Читаем справку вслух с выражением. По первЫх строках ея видим две перегруженные функции.

              ExpandedWrap disabled
                function StrToFloat(const S: string): Extended; overload;
                function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;


              Вторая из них имеет дополнительный параметр. Значит, чтобы использовать именно её, нужно вызывать со вторым параметром


              Если разделитель в строке запятая, то его и нужно указывать. Т.е. назначить DecimalSeparator, о чём тоже в справке есть. При чём тут DateSeparator?

              ExpandedWrap disabled
                var
                  s : string;
                  d : Double;
                  fs: TFormatSettings;
                begin
                  s := '22,767';
                  fs.DecimalSeparator := ',';
                  d:= StrToFloat(s, fs);
              Сообщение отредактировано: MBo -
                MBo спасибо за подробный пример, но наверное я не правильно смог объяснить что именно мне нужно. Есть переменная s типа string = '22,767', есть массив типа R: array [1..4]of Double. Мне надо записать эти данные в массив в виде 22.767, т.е. не с "запятой", а через точку!

                ExpandedWrap disabled
                  var
                    s : string;
                    d : Double;
                    fs: TFormatSettings;
                  begin
                    s := '22.767';
                    fs.DecimalSeparator := '.';
                    d:= StrToFloat(s, fs);
                   
                    s := '22,767';
                    fs.DecimalSeparator := ',';
                    d:= StrToFloat(s, fs);


                т.е. при любом раскладе d = 27,767 а мне надо что бы d было равно 27.767
                Сообщение отредактировано: BackUp -
                  :D Тут мало кто справится. Хотя... :popcorn:

                  <можно поставить на автоудаление>
                    Вот сделаешь, как у меня в примере

                    ExpandedWrap disabled
                      ...
                      R[1] :=  StrToFloat(s, fs);
                      ...


                    и всё будет как положено. Отличай числа и их строковое представление.
                      то ли лыжи не едут...

                      MBo, ты сам пробовал свой пример? Мне нужна ТОЧКА, а там запятая! :wall:
                        ТС жжот :D
                          Цитата BackUp @
                          т.е. при любом раскладе d = 27,767 а мне надо что бы d было равно 27.767

                          Это одно и то же число в разном строковом представлении. Число d:double хранится не в строковом виде, а в особом двоичном формате, поэтому ему по барабану какой там у тебя DecimalSeparator. А точка или запятая появляются тогда, когда это число преобразуется в строку. Если на твоем компе используется DecimalSeparator = ',', то соотв-но и все функции преобразования числа в строку по умолчанию будут выдавать значения с разделителем "запятая". Если тебе не нравится это (дурное бухгалтерское) представление, то на своем компе ты можешь поменять разделитель на "точку" через "Панель управления" \ "Региональные стандарты". Если же ты хочешь, чтобы в твоей программе вещественные числа выводились с точкой, независимо от установленного на компе значения DecimalSeparator, то для этого нужно использовать либо расширенные функции преобразования числа в строку с FormatSettings, либо старую добрую паскалевскую процедуру Str, которая всегда выдает строковое представление числа с точкой независимо от DecimalSeparator.
                            Прошу прощения)))

                            Пример MBo рабочий. Благодаря объяснениям leo, я вышел из тупика... в коде был мой косяк из-за него программа выбивала ошибку.

                            Спасибо всем за участие, очень помогли
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0602 ]   [ 16 queries used ]   [ Generated: 21.06.25, 15:08 GMT ]