在Floats中存储TDateTime时避免区域设置冲突?

时间:2011-02-16 14:43:28

标签: delphi floating-point

我使用Floating vars将TDateTime thing修复为一个文件。但是,现在我遇到了一个新问题:浮点无效 - 很可能是因为逗号分隔符。

如何在程序中设置默认分隔符?或者还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

当您致电TFormatSettingsStrToFloat时,您可以使用FloatToStr记录来指定小数点分隔符。你必须决定使用什么并坚持下去。以下是带有.

的示例代码
var
    d: TDateTime;
    s: string;
    fs: TFormatSettings;
begin
    d := Now();
    fs.DecimalSeparator := '.';
    s := FloatToStr(d, fs);
end;

另一种选择是使用XML标准日期时间格式。 Delphi在XSBuiltIns中有一些函数可以执行从TDateTimestring的转换。您将在值中设置时区偏移,因此如果将持久化的TDateTime从一个时区移动到另一个时区,则可能会有一些不需要的行为。这取决于值的用法。

var
    d: TDateTime;
    s: string;
begin
    d := Now();
    s := DateTimeToXMLTime(d);
    d := XMLTimeToDateTime(s);
end;

答案 1 :(得分:1)

正如米卡尔所说,有很多方法可以做到这一点。要重新上限,您希望以文本格式将TDateTime存储到文件中,并且无论恢复发生的区域设置如何,都能够成功恢复此值。

选项1

存储时,请拨打FloatToStr,但请强制“。”通过TFormatSettings参数的小数分隔符。在还原时,请使用StrToFloatTFormatSettings相同的<{1}}。

选项2

使用base 64对8字节TDateTime值进行编码。这样做的缺点是它使值不可读。

选项3

与选项1类似,但通过调用TDateTime并显式传递不依赖于语言环境中的任何内容的DateTimeToStr来对TFormatSettings进行编码,因此不要依赖于语言环境的日期或时间分隔符,而不是强迫你自己。使用相同的StrToDateTime记录来反转TFormatSettings来电。