好吧,我会试着解释一下。 我有一个名为Calc的类,用于计算字符串或const char *数字表达式,如“2 *(3/5)”或类似的。
现在我正在尝试在Qt中构建一个计算器,使用这些类来评估QLineEdit的输入。
班级的工作原理如下:
Calc(const std::string &sExpresion);
Calc(const char* cExpresion);
和
void anadirExpresion(const std::string &sExpresion);
void anadirExpresion(const char* cExpresion);
我尝试在Qt中使用它:
void Calculadora::evaluar()
{
QLocale locale;
QByteArray cadena = ui->pantalla->text().toLocal8Bit();
const char* expresionAEvaluar = cadena.data();
qDebug()<<"Cadena a evaluar: "<<cadena;
std::cout<<"Cadena: "<<expresionAEvaluar<<std::endl;
evaluador.anadirExpresion(expresionAEvaluar); //evaluador is the class Calc instance
float resultado=evaluador.CalcularExpresion();
qDebug()<<"Resultado: "<<resultado;
ui->pantalla->setText(QString::number(resultado));
}
尝试使用带有const char *表达式的Class
这是使用std :: string表达式的尝试
void Calculadora::evaluar()
{
//std::string cadena = ui->pantalla->text().toStdString();
//qDebug()<<"Cadena a evaluar: "<<ui->pantalla->text();
std::cout<<"Cadena: "<<ui->pantalla->text().toStdString()<<std::endl;
evaluador.anadirExpresion(ui->pantalla->text().toStdString());
float resultado=evaluador.CalcularExpresion();
qDebug()<<"Resultado: "<<resultado;
ui->pantalla->setText(QString::number(resultado));
}
问题是我在“。”之后丢失了数据。字符。 如果我有“2.3”,则计算器执行“2” 此外,这个问题只出现在Linux中,因为在Windows下的Qt中它运行正常。 它在Linux和Windows下的控制台模式下运行良好。
此外,QDebug()和std :: cout的Qt控制台中的输出显示正确的字符串。
建议?
抱歉我的英语很差,感谢先进。
***更新:
最后,我认为这个错误是因为在linux下的Qt下编译的函数atof()无法正常工作。我听起来毫无意义但是,我按照“2.5”值来寻找改变的地方,之后它改变了(改为Calc的成员函数)
EP[t].OP.operando=atof(aux);
std::cout<<"changed? "<<aux<<std::endl;
std::cout<<"changed: "<<EP[t].OP.operando<<std::endl;
在控制台下,atof()函数后,EP [t] .OP.operando值为“2.5”。 在Windows中也是如此。 但是在Linux中,我获得了“2”的价值。
现在我再试一次:
char cad[]="2.5";
EP[t].OP.operando=atof(cad);
std::cout<<"changed: "<<EP[t].OP.operando<<std::endl;
在控制台下,EP [t] .OP.operando值= 2.5,但在Qt下是2
也许是个错误?有人确认吗?
谢谢
答案 0 :(得分:1)
我怀疑语言环境会发生。可能你的系统语言环境是某种欧洲语言,其中小数点分隔符是逗号,而不是点。
要验证我的暂停,您可以:
,
)作为小数点分隔符或您可以在日志中打印此变量的值(see documentation):
qDebug() << "Decimal separator: " << localeconv()->decimal_point;
如果我是对的,那么这不是一个错误,而是一个功能:)。
<小时/> 我写了一些测试应用程序来验证我的暂停,我是对的,我写了这个插槽:
void MainWindow::processText(const QString &txt)
{
std::string s = txt.toStdString();
std::stringstream stream(s);
double x;
x = std::atof(s.c_str());
emit atofResultString(QString::number(x));
if (stream >> x) {
emit stdstreamResult(QString::number(x));
}
}
我在Ubuntu 12.04上使用波兰语语言环境设置测试了这个。结果是atof
考虑了系统区域设置。
答案 1 :(得分:0)
完成后,您能告诉函数evaluar()
是否正常工作:
QByteArray cadena = ui->pantalla->text().toLocal8Bit();
const char* expresionAEvaluar = cadena.data();
如果它正常工作,那么我建议你也为std::string
使用相同的功能。
这可以使用std::string::c_str()
完成。
所以你可以写ui->pantalla->text().toStdString().c_str()
。
但是,当您使用QString
函数时,const char*
和toLocal8bit()
之间的转换效果最佳。
答案 2 :(得分:0)
谢谢你的回答。
我试图改变程序的环境,添加一个QLocale指针并在constuctor中进行:
valor = new QLocale (QLocale::C,QLocale::UnitedStates);//valor is a QLocale pointer
我已明确更改了我的国家/地区的此值:
valor = new QLocale (QLocale::Spanish,QLocale::Spain);
我也尝试在“。”之间切换。和“,”表示两种环境(西班牙和美国)的小数点
经过另一次头痛之后,你给了我一个想法,从字符串流对象中获取浮点值,而不是使用atof()函数。
std::stringstream ss(aux);
ss>>EP[t].OP.operando;
现在它工作正常。 实际上我没有解决问题(Locale问题),但我解决了这个问题。 我必须像SOLVED一样标记帖子吗?
再次感谢你!