Конвертация строки в числовой
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
  
    Конвертация строки в числовой
    
  | 
         
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Добрый день! 
        
      Не могу найти способ конвертировать string в тип double. StrToFloat - не подходит, потому что мне нужно конвертировать с разделителем точка. Например ![]() ![]() var  s: string;  d: double; begin  s := 12.12345  d := FloatToStr(s); выдает ошибку "is not a valid floating point value". Небольшое примечание, программа пишется под Android. Заранее большое спасибо!  | 
    
| 
         
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
| 
         
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Возможно вы имели ввиду этот код... 
        
      ![]() ![]() 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. Он выдает мне новые ошибки((  | 
    
| 
         
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Второй вариант функции позволяет использовать набор установок, включающий нужный разделитель 
        
      ![]() ![]() function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;  | 
    
| 
         
         
         
          
           Сообщ.
           #5
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Не совсем понятно, какой второй вариант?  
        
      ![]() ![]() var   s : string;   d : Double; begin   s := '22,767'; // У меня в системе разделитель - точка   FormatSettings.DateSeparator:= '.';   d:= StrToFloat(s); Попробовал, никаких изменений((  | 
    
| 
         
         
         
          
           Сообщ.
           #6
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Читаем справку вслух с выражением. По первЫх строках ея видим две перегруженные функции.  
        
      ![]() ![]() function StrToFloat(const S: string): Extended; overload; function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload; Вторая из них имеет дополнительный параметр. Значит, чтобы использовать именно её, нужно вызывать со вторым параметром Если разделитель в строке запятая, то его и нужно указывать. Т.е. назначить DecimalSeparator, о чём тоже в справке есть. При чём тут DateSeparator? ![]() ![]() var   s : string;   d : Double;   fs: TFormatSettings; begin   s := '22,767';    fs.DecimalSeparator := ',';   d:= StrToFloat(s, fs);  | 
    
| 
         
         
         
          
           Сообщ.
           #7
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          MBo спасибо за подробный пример, но наверное я не правильно смог объяснить что именно мне нужно. Есть переменная s типа string = '22,767', есть массив типа R: array [1..4]of Double. Мне надо записать эти данные в массив в виде 22.767, т.е. не с "запятой", а через точку! 
        
      ![]() ![]() 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  | 
    
| 
         
         
         
          
           Сообщ.
           #8
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Тут мало кто справится. Хотя...    <можно поставить на автоудаление>  | 
    
| 
         
         
         
          
           Сообщ.
           #9
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Вот сделаешь, как у меня в примере 
        
      ![]() ![]() ... R[1] :=  StrToFloat(s, fs); ... и всё будет как положено. Отличай числа и их строковое представление.  | 
    
| 
         
         
         
          
           Сообщ.
           #10
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          то ли лыжи не едут... 
        
      MBo, ты сам пробовал свой пример? Мне нужна ТОЧКА, а там запятая!     | 
    
| 
         
         
         
          
           Сообщ.
           #11
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          ТС жжот   
        
          | 
    
| 
         
         
         
          
           Сообщ.
           #12
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата BackUp @  т.е. при любом раскладе d = 27,767 а мне надо что бы d было равно 27.767 Это одно и то же число в разном строковом представлении. Число d:double хранится не в строковом виде, а в особом двоичном формате, поэтому ему по барабану какой там у тебя DecimalSeparator. А точка или запятая появляются тогда, когда это число преобразуется в строку. Если на твоем компе используется DecimalSeparator = ',', то соотв-но и все функции преобразования числа в строку по умолчанию будут выдавать значения с разделителем "запятая". Если тебе не нравится это (дурное бухгалтерское) представление, то на своем компе ты можешь поменять разделитель на "точку" через "Панель управления" \ "Региональные стандарты". Если же ты хочешь, чтобы в твоей программе вещественные числа выводились с точкой, независимо от установленного на компе значения DecimalSeparator, то для этого нужно использовать либо расширенные функции преобразования числа в строку с FormatSettings, либо старую добрую паскалевскую процедуру Str, которая всегда выдает строковое представление числа с точкой независимо от DecimalSeparator.  | 
    
| 
         
         
         
          
           Сообщ.
           #13
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Прошу прощения))) 
        
      Пример MBo рабочий. Благодаря объяснениям leo, я вышел из тупика... в коде был мой косяк из-за него программа выбивала ошибку. Спасибо всем за участие, очень помогли  |