Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> StrToFloat - преобразовать запятую в точку, и наоборот взависимости от язык.настроек 
V
    Опции темы
Чoо
Дата 6.3.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



вобщем вопрос в следующем: взависимосты от языковых настроек системы функция StrToFloat в строковой переменной использует для разделения целой части от дробной символ точки или символ запятой. Если, скажем, языковые настройки Русский, то функция будет ругаться на точку, а если яз. настройки Английский, то на запятую. Так вот, как сделать так, что бы взависимости от языковых настроек точка преобразовывалась в запятую и наоборот?
Я прост даже не знаю как получить язык системы, так бы может попытался решить вопрос. Справку делфи читал, но что-то не нашел то что нужно. 


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Coder
Дата 6.3.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 2
Всего: 11



Код

{ Формирование и возврат FormatSettings с установленной десятичной точкой }
function DotSettings: TFormatSettings;
begin
  GetLocaleFormatSettings (GetThreadLocale, Result);
  Result.DecimalSeparator := '.';
end;

{ Формирование и возврат FormatSettings с установленной десятичной запятой }
function CommaSettings: TFormatSettings;
begin
  GetLocaleFormatSettings (GetThreadLocale, Result);
  Result.DecimalSeparator := ',';
end;

{ StrToFloat с точкой в роли десятичного разделителя }
function StrToFloatDot(const Value: string): c_float;
begin
  Result := StrToFloat (Value, DotSettings);
end;

{ StrToFloat с запятой в роли десятичного разделителя }
function StrToFloatComma(const Value: string): c_float;
begin
  Result := StrToFloat (Value, CommaSettings);
end;

function StrToFloatAny (const Value: string): c_float;
begin
  if not TryStrToFloat (Value, Result, CommaSettings) then
    Result := StrToFloat (Value, DotSettings);
end;

{ TryStrToFloat с точкой в роли десятичного разделителя }
function TryStrToFloatDot (const Value: string; out FValue: c_float): boolean;
begin
  Result := TryStrToFloat (Value, FValue, DotSettings);
end;

{ TryStrToFloat с запятой в роли десятичного разделителя }
function TryStrToFloatComma (const Value: string; out FValue: c_float): boolean;
begin
  Result := TryStrToFloat (Value, FValue, CommaSettings);
end;

function TryStrToFloatAny(const Value: string; out FValue: c_float): boolean;
begin
  Result:=TryStrToFloatComma(Value, FValue);  // пробуем перевести используя запятую

  if not Result then                  // если не прошло пробуем точку
    Result:=TryStrToFloatDot(Value, FValue);
end;


c_float = single

Это сообщение отредактировал(а) Coder - 6.3.2010, 15:48
PM MAIL   Вверх
Данкинг
Дата 6.3.2010, 16:44 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



В общем случае - задавай принудительно разделитель (DecimalSeparator := ',') при создании формы.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Чoо
Дата 6.3.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Coder, Данкинг, Спасибо за помощь. 
Вопрос отмечаю решенным. 


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Coder
Дата 7.3.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 2
Всего: 11



Цитата(Данкинг @  7.3.2010,  00:44 Найти цитируемый пост)
В общем случае - задавай принудительно разделитель (DecimalSeparator := ',') при создании формы.


Автор никогда так не делай!!! На этом можно очень сильно обжечься. Был горький опыт :(
PM MAIL   Вверх
Чoо
Дата 9.3.2010, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



Coder, хорошо, поверю горькому опыту smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Coder
Дата 9.3.2010, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 2
Всего: 11



Цитата(Чoо @ 9.3.2010,  11:13)
Coder, хорошо, поверю горькому опыту smile

Грубо говоря, когда на 100 машинах софт работает отменно находится 2-3, где программа начинает гнать в самом неожиданном месте. Как оказалось, у клиента стоит софт, который меняет в системе параметр DecimalSeparator. А выяснялось это долго и нудно.
Самое интересно, что еще давно про DecimalSeparator я вычитал на форуме. Так что доверяй, проверяй и используй с умом.
PM MAIL   Вверх
pseud
Дата 9.3.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Чoо @  6.3.2010,  17:24 Найти цитируемый пост)
Coder, Данкинг, Спасибо за помощь. Вопрос отмечаю решенным. 

не торопись, я тоже выступлю.
перед форматированием заменяй все точки и все запятые на DecimalSeparator.
Код

var
  s: string;
  f: Extended;
begin
  s := MyValue;
  s := StringReplace(s,'.',DecimalSeparator,[]);
  s := StringReplace(s,',',DecimalSeparator,[]);
  f := StrToFloat(s);
end;

Цитата(Данкинг @  6.3.2010,  16:44 Найти цитируемый пост)
В общем случае - задавай принудительно разделитель (DecimalSeparator := ',') при создании формы.

очень не рекомендую


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Чoо
Дата 9.3.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



pseud, ух, довольно гибкий вариант smile
кстати программу скомпилил по пути наименьшего сопротивления и принудительно задал разделитель smile, хорошо, что предупредили о возможных глюках smile. А вот у меня вопрос такой: вот когда мы задаем разделитель, мы его задаем в самой системе или только для приложения? интересна природа глюков. программа пока тестировалась только на русскоязычных ОС.


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
pseud
Дата 10.3.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Чoо @  9.3.2010,  15:33 Найти цитируемый пост)
вот когда мы задаем разделитель, мы его задаем в самой системе или только для приложения?

DecimalSeparator - это глобальная переменная приложения, которая инициализируется из системной пременной. 
Ты ее можешь переопределить. Но это не хорошо. Представь, если сторонние компоненты будут переопределять ее, как им захочется. Тебе будет больно и обидно. Лучше научись жить с ней универсально.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Чoо
Дата 10.3.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: нет
Всего: 4



pseud, ну и времени на отладку уйдет немеренно. Ок, понял, спасиб smile.


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.3454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.