gpt4 book ai didi

delphi - 我的美国 Ini 文件可以与欧洲格式浮点一起使用吗

转载 作者:行者123 更新时间:2023-12-01 19:53:48 25 4
gpt4 key购买 nike

我正在 Windows 32 位 VCL 平台上使用 C++Builder XE4。

我正在设置 .INI 文件,其中包括使用句点 (.) 作为小数分隔符的 float 。在欧洲,他们使用逗号 (,) 作为小数点分隔符。

我正在使用 C++Builder 中内置的 TIniFile 类。

TIniFile 会在欧洲读取以下文件条目吗?我是否需要第二个以逗号作为分隔符的 .INI 文件?

当我读取浮点值时,我的故障安全返回值也使用句点 (.)。在下面的代码中,

ReadFloat("Forex", "Size",  0.01   ); 

0.01 是故障安全返回值。

这在欧洲行得通吗?

例如:

MyList.ini:

[Forex]
Size=0.0001
Value=10.5
OffSet=0.01


//Read TIniFile
MyList = new TIniFile("C:\\MyList.ini");
double r_Size = MyList->ReadFloat("Forex", "Size", 0.01);
double r_Value = MyList->ReadFloat("Forex", "Value", 10.0);
double r_OffSet = MyList->ReadFloat("Forex", "OffSet", 0.01);

编辑如下

您在回答中指出,如果 TIniFile 是在可以正确读取的同一位置写入和读取的。是否可以一次打开并重新保存我的 .INI 文件以将其转换为本地格式?然后我就可以使用当前的代码而无需更改。我将为 .INI 文件中的每个 float 循环执行以下三个步骤。这可以重新格式化 .INI 文件吗?

我只需要调整故障安全返回值即可使用本地分隔符。

步骤1)检查分隔符的本地值
步骤 2) 使用美国格式 (.) 分隔符加载浮点
步骤3)使用本地分隔符重新保存

void __fastcall ConvertToLocalSeparator( ){ 

//1 Check Local Value of Seperator
TFormatSettings fmt = TFormatSettings::Create();
UnicodeString Local = fmt.DecimalSeparator;
UnicodeString Euro = ",";

if( CompareText(Local, Euro )==0 ){ //Local DecimalSeparator is Coma(,)

//2 Load Float using US format (.) Separator
TFormatSettings USfmt = TFormatSettings::Create(); // get defaults
USfmt.DecimalSeparator = '.';
USfmt.ThousandSeparator = '\0'; //'\0' to disable

TIniFile *MyList;
MyList = new TIniFile("C:\\MyList.ini");
double r_Size = StrToFloatDef(MyList->ReadString("Forex", "Size", ""), 0.01, USfmt);
delete MyList;
MyList=NULL;

//3 Re-Save with local Separator
MyList = new TIniFile("C:\\MyList.ini");
MyList->WriteFloat("Forex", "Size", r_Size );
delete MyList;
MyList=NULL;
}

}

最佳答案

内部,ReadFloat()使用ReadString()然后调用非TFormatSettings StrToFloat() 的版本转换Stringdouble 。同样,WriteFloat()调用非-TFormatSettings FloatToStr() 的版本转换doubleString然后调用WriteString() .

StrToFloat() 的那些版本和FloatToStr()依赖全局DecimalSeparator SysUtils 中的变量单位,取决于区域设置。因此,,当 ReadFloat() 时,您的现有代码将不能按原样工作。在使用与调用 WriteFloat() 的系统不同的区域设置的系统上调用.

要解决此问题,您有两种选择:

  1. 更改全局DecimalSeparator的值变量为'.' 。不推荐,但可以做到。

  2. 忘记WriteFloat()ReadFloat()共。使用WriteString()ReadString()直接,自己处理浮点转换,这样您就可以使用在所有系统上一致的任何固定格式。

    //Write TIniFile

    TFormatSettings fmt = TFormatSettings::Create(); // get defaults
    fmt.DecimalSeparator = _D('.');
    fmt.ThousandSeparator = _D(','); // or '\0' to disable

    MyList = new TIniFile(_D("C:\\MyList.ini"));
    MyList->WriteString(_D("Forex"), _D("Size"), FloatToStr(r_Size, fmt));
    MyList->WriteString(_D("Forex"), _D("Value"), FloatToStr(r_Value, fmt));
    MyList->WriteString(_D("Forex"), _D("OffSet"), FloatToStr(r_OffSet, fmt));

    //Read TIniFile

    TFormatSettings fmt = TFormatSettings::Create();
    fmt.DecimalSeparator = _D('.');
    fmt.ThousandSeparator = _D(','); // or '\0' to disable

    MyList = new TIniFile(_D("C:\\MyList.ini"));
    double r_Size = StrToFloatDef(MyList->ReadString(_D("Forex"), _D("Size"), _D("")), 0.01, fmt);
    double r_Value = StrToFloatDef(MyList->ReadString(_D("Forex"), _D("Value"), _D("")), 10.0, fmt);
    double r_OffSet = StrToFloatDef(MyList->ReadString(_D("Forex"), _D("OffSet"), _D("")), 0.01, fmt);
<小时/>

更新:如果您想使用本地格式读取并重新保存文件(我不推荐),您可以尝试类似这样的操作:

TFormatSettings USFmt;
TFormatSettings EuroFmt;

void __fastcall InitFormats()
{
USFmt = TFormatSettings::Create();
USFmt.DecimalSeparator = _D('.');
USFmt.ThousandSeparator = _D('\0');

EuroFmt = TFormatSettings::Create();
EuroFmt.DecimalSeparator = _D(',');
EuroFmt.ThousandSeparator = _D('\0');
}

void __fastcall CheckLocalFormat(TCustomIniFile *Ini, String Section, String Name, double Default)
{
double value;
String s = Ini->ReadString(Section, Name, _D(""));
if (!TryStrToFloat(s, value))
{
if (!TryStrToFloat(s, value, USFmt) && !TryStrToFloat(s, value, EuroFmt))
value = Default;
Ini->WriteFloat(Section, Name, value);
}
}

void __fastcall CheckLocalFormat( )
{
TIniFile *MyList = new TIniFile(_D("C:\\MyList.ini"));
CheckLocalFormat(MyList, _D("Forex"), _D("Size"), 0.01);
CheckLocalFormat(MyList, _D("Forex"), _D("Value"), 10.0);
CheckLocalFormat(MyList, _D("Forex"), _D("Offset"), 0.01);
delete MyList;
}

关于delphi - 我的美国 Ini 文件可以与欧洲格式浮点一起使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42708815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com