2015-07-10 2 views
0

Я пытаюсь записать в xml-файл, но у меня возникают трудности с обработкой чисел с плавающей запятой, поскольку они используют запятую (,) в качестве десятичного разделителя, хотя мои региональные настройки заданы как точка (.) для десятичного разделителя. У меня такая проблема в Windows Server 2012, но в Windows XP я этого не испытываю.Числа с плавающей запятой - Десятичный разделитель

GetLocaleFormatSettings(GetThreadLocale, LocalFormatSettings); 
    LocalFormatSettings.DecimalSeparator := '.'; 

    SHElem := xml.Root.Items.Add('SalesHeader'); 
    with SHElem do begin 
    Items.Add('STORENUMBER', ssCurrentStoreNumber); 
     case VarType(Dataset.FieldByName('Amounts').asFloat) of 
     varCurrency : Items.Add('Amounts', FloatToStr(Dataset.FieldByName('Amount').asFloat,LocalFormatSettings)); 
     else   
     Items.Add('Fields', Dataset.FieldByName('Fields').AsString); 
     end 
    end; 
+0

Как вы записываете числа с плавающей точкой в ​​файл XML? Пожалуйста, покажите соответствующий фрагмент кода. – dlask

+0

Если это значение в $/cent, и вы контролируете как читателя, так и автора, вы можете позволить поле быть выраженным в центах вместо $ (т. Е. Умножить значение на 100, чтобы получить целое число для хранения в XML, а затем разделите его на 100 на принимающей стороне). Таким образом, вы независимы от фактического децимального разделителя (поскольку его нет). – HeartWare

+0

Если вы используете Delphi 'TXMLDocument' для записи, вам, возможно, придется писать поплавки в виде строки и использовать метод, описанный @DavidHeffernan. Обратите внимание, что даты/время также требуют специальных процедур, поскольку Delphi не соответствует стандартам XML-схемы в 'TXMLDocument'. –

ответ

3

Используйте объект настроек формата при преобразовании из поплавка в строку. Например:

var 
    fs: TFormatSettings; 
.... 
GetLocaleFormatSettings(GetThreadLocale, fs); 
fs.DecimalSeparator := '.'; 

Тогда при конвертировании, сделать так, как это, например:

str := FloatToStr(Value, fs); 
+0

Я пытался это сделать, но, похоже, мое приложение игнорирует мою переменную. – Fero

+0

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

+0

См. Выше, я вставил свой код – Fero

1

Сначала вы должны поместить в файл проекта, UpdateFormatSettings собственности ложным, чтобы предотвратить все изменения, SO или других приложений, таких как MS Excel и т. Д.

{$R *.res} 
begin 
    Application.Initialize; 
    Application.UpdateFormatSettings:=False; 
    ...... 
    Application.Run; 
end. 

После этого, вы должны поместить следующий код в созданной вами форме fisrst.

FormatSettings.decimalseparator:='.'; 

// you can find other interestin settings like this: 
FormatSettings.TimeSeparator:=':'; 
FormatSettings.ShortDateFormat:='dd/MM/yyyy'; 
FormatSettings.ShortTimeFormat:='hh:mm:ss'; 
FormatSettings.LongTimeFormat:='hh:mm:ss'; 

Код, указанный выше, используется на XE7. В Delphi 6/7 вы должны изменить код следующим образом:

//this one is the same 
    Application.UpdateFormatSettings := false; 

для региональных настроек вы можете написать это:

decimalseparator:='.'; 
TimeSeparator:=':'; 
ShortDateFormat:='dd/MM/yyyy'; 
ShortTimeFormat:='hh:mm:ss'; 
LongTimeFormat:='hh:mm:ss'; 

В Delphi 2009 Вы можете использовать глобальную переменную DecimalSeparator (объявившего в блоке SysUtils), например DecimalSeparator: = '.'

+0

Вопрос отмечен Delphi 2009, поэтому мы знаем, какая версия используется –

Смежные вопросы