hom*_*ase 2 delphi ini c++builder
我正在使用C++ Builder XE4和Windows 32位VCL平台.
我正在设置.INI文件,其中包括使用句点(.)作为小数分隔符的浮点数.在欧洲,他们使用逗号(,)作为小数分隔符.
我正在使用TIniFileC++ Builder内置的类.
会TIniFile在欧洲阅读下面的文件条目吗?我需要.INI使用逗号作为分隔符的第二个文件吗?
当我读取浮点值时,我的故障安全返回值也使用句点(.).在下面的代码中,
ReadFloat("Forex", "Size", 0.01 );
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
编辑在下面
您在答案中指出TIniFile是否在正确读取的相同位置写入和读取.是否可以打开并重新保存我的.INI文件一次以将它们转换为本地格式?然后,我可以使用我当前的代码,没有任何变化.我将在循环中为我的.INI文件中的每个浮点执行以下三个步骤.这会重新格式化.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;
}
}
Run Code Online (Sandbox Code Playgroud)
在内部,ReadFloat()使用ReadString()然后调用NON TFormatSettings版本将StrToFloat()其转换String为a double.同样,WriteFloat()调用NON TFormatSettings版本将FloatToStr()其转换double为a String然后调用WriteString().
那些版本的StrToFloat()和FloatToStr()依赖于单元中的全局DecimalSeparator变量SysUtils,这是与语言环境相关的.所以不,在使用与调用系统不同的语言环境的系统上调用时,现有代码将不会按原样ReadFloat()运行WriteFloat().
要解决这个问题,您有两种选择:
将全局DecimalSeparator变量的值更改为'.'.不推荐,但可以做到.
忘记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));
Run Code Online (Sandbox Code Playgroud)
//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);
Run Code Online (Sandbox Code Playgroud)更新:如果您想使用本地格式(我不推荐)阅读并重新保存文件,您可以尝试更像这样的内容:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |