那么我会试着解释一下。 我有一个名为计算类,评估一个string或常量字符*数字expression式,如“2 *(3/5)”或类似。
现在我正在尝试在Qt中构build一个计算器,使用这些类来评估QLineEdit的input。
class级的工作就是这样的:
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 *expression式的类
这是一个std :: stringexpression式的尝试
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”计算器perfoms“2”此外,这个问题是只在Linux中,因为在Windows下的Qt它运行正常。 在Linux和Windows下,它可以在控制台模式下正常工作。
此外,QDebug()和std :: cout的Qt控制台中的输出显示正确的string。
build议?
对不起,我的英语不好,感谢先进。
***更新:
明确地说,我认为这个错误是因为在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
也许是一个错误? 有人确认吗?
谢谢
我怀疑区域设置踢英寸可能您的系统区域设置是一些欧洲语言,其中小数点分隔符是一个逗号,而不是一个点。
要验证我的暂停,您可以:
,
)作为小数点分隔符 您可以打印此变量的日志值( 请参阅文档 ):
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
将系统区域设置考虑在内。
你可以告诉你函数evaluar()
是否正常工作:
QByteArray cadena = ui->pantalla->text().toLocal8Bit(); const char* expresionAEvaluar = cadena.data();
如果正在工作,那么我建议你也使用相同的函数为std::string
。 这可以使用std::string::c_str()
来完成。
所以你可以写ui->pantalla->text().toStdString().c_str()
。
但是,当你使用toLocal8bit()
函数的时候,在QString
和const char*
之间转换效果最好。
谢谢你的回答。
我试图改变我的程序的环境,添加一个QLocale指针,并在构造函数中:
valor = new QLocale (QLocale::C,QLocale::UnitedStates);//valor is a QLocale pointer
我已经明确地为我的国家改变了这个价值:
valor = new QLocale (QLocale::Spanish,QLocale::Spain);
此外,我试图改变“之间”。 和“,”在这两个环境(西班牙和美国)的小数点,
在又一次令人头疼的时候,你给了我一个想法,从stringstream对象中获取浮点值,而不是使用atof()函数。
std::stringstream ss(aux); ss>>EP[t].OP.operando;
现在它工作正常。 其实我没有解决这个问题(Locale问题),但我解决了这个问题。 我必须像SOLVED标志的职位?
再次感谢你!