
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Сообщ.
#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, я вышел из тупика... в коде был мой косяк из-за него программа выбивала ошибку. Спасибо всем за участие, очень помогли |