首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的美国Ini文件会使用欧洲格式浮点数吗?

我的美国Ini文件会使用欧洲格式浮点数吗?
EN

Stack Overflow用户
提问于 2017-03-10 01:56:55
回答 1查看 514关注 0票数 2

我使用的是C++Builder XE4和Windows32位VCL平台.

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

我使用的是内置于TIniFile的C++Builder类。

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

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

代码语言:javascript
复制
ReadFloat("Forex", "Size",  0.01   ); 

0.01是故障安全返回值.

这在欧洲行得通吗?

例如:

MyList.ini:

代码语言:javascript
复制
[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文件中的每个浮动,我将在循环中执行下面的三个步骤。这样可以重新格式化.INI文件吗?

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

步骤1)检查分离器的局部值

第2步)使用US格式加载浮动(.)分隔符

步骤3)用本地分离器重新保存

代码语言:javascript
复制
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;
}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-10 02:45:12

在内部,ReadFloat()使用ReadString(),然后调用非TFormatSettings版本的StrToFloat()String转换为double。同样,WriteFloat()调用非TFormatSettings版本的FloatToStr()double转换为String,然后调用WriteString()

这些版本的StrToFloat()FloatToStr()依赖于SysUtils单元中的全局DecimalSeparator变量,该变量依赖于区域设置。因此,NO,您现有的代码将不像-那样工作,因为在使用与调用WriteFloat()的系统不同的区域设置的系统上调用ReadFloat()

要解决这个问题,您有两个选择:

  1. 将全局DecimalSeparator变量的值更改为'.'。不推荐,但可以做。
  2. 忘掉WriteFloat()ReadFloat()吧。直接使用WriteString()ReadString(),自己处理浮点转换,这样您就可以使用所有系统上一致的固定格式。 // TIniFile TFormatSettings fmt = TFormatSettings::Create();// get默认值fmt.DecimalSeparator = _D('.');fmt.ThousandSeparator = _D(',');/或‘0’禁用MyList =新TIniFile(_D("C:\MyList.ini"));MyList->WriteString(_D(“外汇”))、_D(“大小”)、FloatToStr(r_Size、fmt);MyList->WriteString(_D(“外汇”)、_D("Value")、FloatToStr(r_Value,fmt))、MyList->WriteString(_D(“外汇”)、_D("OffSet")、FloatToStr(r_OffSet,fmt));

//阅读TIniFile TFormatSettings fmt = TFormatSettings::Create();fmt.DecimalSeparator =_D(‘.’. ');fmt.ThousandSeparator = _D(',‘’);/或‘0’禁用MyList =新TIniFile(_D("C:\MyList.ini"));double r_Size =StrToFloatDef(MyList->ReadString(_D(“外汇”))、_D(“大小”)、_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);

Update:如果您想使用本地格式(我不推荐)读取和重新保存文件,可以尝试以下更多的方式:

代码语言:javascript
复制
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;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42708815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档