我敢打赌,你的问题是小数点。用于它的字符是 Windows 环境变量之一,并且可能因计算机而异。有 winapi 调用来接收它,但我不记得它们......
问题AnsiString("1.23").ToDouble()
在于它catch/try
不会捕获异常(至少在我的编译器BDS2006上)。有解决方法。我正在使用atoi()
它不会崩溃,而是在存在无效字符时截断为整数,因此它可用于检测正确的小数点字符和转换:
char _floating_point_char=' '; // decimal point separator
AnsiString strnum (AnsiString s,int sig=1,int pnt=1,int hex=0,char dot=_floating_point_char);
double str2num(AnsiString s,int sig=1,int pnt=1,int hex=0,char dot=_floating_point_char);
AnsiString strnum(AnsiString s,int sig,int pnt,int hex,char dot)
{
if (dot==' ')
{
float x;
x=atof("0.5"); if (x>=0.25) _floating_point_char='.';
x=atof("0,5"); if (x>=0.25) _floating_point_char=',';
dot=_floating_point_char;
}
int i,l,a,e,e0,exp=pnt;
AnsiString q="";
l=s.Length();
if (hex) exp=0; // exponent is e,E so it colide with hex e,E
e0=0; for (i=1;i<=l;i++)
{
e=0;
a=s[i];
if ((a>='0')&&(a<='9')) { e=1; q+=char(a ); sig=0; }
if ((a>='A')&&(a<='F'&&(hex))){ e=1; q+=char(a ); sig=0; }
if ((a>='a')&&(a<='f'&&(hex))){ e=1; q+=char(a ); sig=0; }
if ((a=='e')||(a=='E'))
if (!hex) { if (!exp) break; e=1; q+=char('e'); exp=0; sig=1; pnt=0; e0=0; }
if (a=='+') { if (!sig) break; e=1; sig=0; }
if (a=='-') { if (!sig) break; e=1; q+=char(a ); sig=0; }
if (a=='.') { if (!pnt) break; e=1; q+=char(dot); pnt=0; }
if (a==',') { if (!pnt) break; e=1; q+=char(dot); pnt=0; }
if ((e0)&&(!e)) break;
e0|=e;
}
if (q.Length()<=0) q="0";
return q;
}
double str2num(AnsiString s,int sig,int pnt,int hex,char dot)
{
return atof(strnum(s,sig,pnt,hex,dot).c_str());
}
它只是检测是否.
是正确的,然后在转换之前将其替换为字符串......从winapi,
粗略获取正确的小数点字符更安全,因为小数点分隔符可以是任何东西......你可以忽略我的部分将其用于任何类型的数字...hex