2013-01-10 15 views
3

下面的代碼給出了一個帶有'。'的Writeln(Outfile,testreal)的實數。小數點分隔符,即使我在我的Windows系統中定義了','。我如何使用Writeln(Outfile,testreal)將一個數字寫入文本文件?文本文件中實數的小數分隔符XE2

(該FloatToStr方法給出確定的結果,因爲它應該。)

procedure TForm1.Button1Click(Sender: TObject); 
var Outfile:textfile; 
    testreal:single; 
    StrDummy : string; 

begin 
    testreal:=1234.1234; 
    assignfile(Outfile,'test_real.txt'); 
    Rewrite(Outfile); 
    StrDummy:='Decimal Separator in Windows: '+GetLocaleChar(GetThreadLocale, LOCALE_SDECIMAL, '.')+#13#10+ 
      'Decimal Separator in Delphi: '+DecimalSeparator; 
    Writeln(Outfile,StrDummy); 
    Writeln(Outfile,testreal); 
    Writeln(Outfile,FloatToStr(testreal)); 
    Closefile(Outfile); 
end; 

Decimal Separator in Windows: , 
Decimal Separator in Delphi: , 
1.23412341308594E+0003      //Ps. Why is there a beginning space here? 
1234,12341308594 
+0

如果您需要重新讀取文本文件,請小心。有效實數可能無法在具有不同小數點分隔符的不同局部正確解釋。 – Shannon

+0

該空間是爲符號保留的。根據您要存儲的文本文件的類型,您可能希望以與區域設置無關的標準方式存儲小數值。這樣可以在任何語言環境中讀取這些值。 –

+0

如果您正在將浮點值寫入XML文檔,則標準十進制字符是'.'。 Delphi中的TXMLDocument可能不會尊重這個事實,請參閱[將十進制值寫入XML](https://forums.embarcadero.com/thread.jspa?threadID=78425)。 –

回答

4

傳統帕斯卡爾I/O使用Str轉換浮點值的文本。 Str硬編碼.的小數點分隔符。

我建議你使用更現代的I/O形式。例如TStreamWriter類使用FloatToStr將浮點轉換爲文本。

+0

這是由於使用舊的I/O風格對具有多行代碼的舊的Delphi 2007項目進行了轉換。有沒有辦法設置Str十進制屬性? – Thomas

+1

你必須破解代碼。這是硬編碼。就個人而言,如果德爾福2007有任何不同,我會感到驚訝。它在Delphi 6中被硬編碼爲「'。'」,這是我手邊的傳統Delphi。所以你的問題甚至在現代Delphi之前就存在了。 –

+0

@托馬斯 - 不,沒辦法。我放棄了編輯System.pas並重建RTL的想法。 – kludg

相關問題