Qt为什么在QLocale()上使用QString::number()。toString()?
我正在开发的应用程序将在许多国家推出,需要支持他们的语言。我回顾了我的代码,并替换了以下每个实例:Qt为什么在QLocale()上使用QString::number()。toString()?,qt,type-conversion,tostring,qstring,qlocale,Qt,Type Conversion,Tostring,Qstring,Qlocale,我正在开发的应用程序将在许多国家推出,需要支持他们的语言。我回顾了我的代码,并替换了以下每个实例: QString::number()和QString().toDouble() 与 QLocale().toString()和QLocale().toDouble() 我在网上没有找到太多比较这两个类的内容,但我对使用后者的影响感兴趣,如果没有,为什么要使用QString函数 本质上,我只是想在做所有这些更改之前,确保我没有损害我的代码。有人知道吗?这些QString方法与区域设置无关:它们总是发生
QString::number()
和QString().toDouble()
与
QLocale().toString()
和QLocale().toDouble()
我在网上没有找到太多比较这两个类的内容,但我对使用后者的影响感兴趣,如果没有,为什么要使用QString
函数
本质上,我只是想在做所有这些更改之前,确保我没有损害我的代码。有人知道吗?这些
QString
方法与区域设置无关:它们总是发生在C
区域设置中。这在I/O未本地化时非常有用,例如,在数据文件中,该文件应可跨地区移植和/或机器可读
您绝对不应该随意地将QString
方法的每次使用都替换为QLocale
中的本地化对应方法!您需要确定哪些用途应该本地化:通常这些用途包括UI,可能还有一些文本文件I/O,其中项目规范规定数字I/O应该本地化。如果规范没有提到这一点,那么值得先修改规范,并在面向用户的文档中记录行为
以下注意事项适用于文本I/O
QString::toDouble
也不直接在输入上使用QLocale::toDouble
,而是首先对输入进行预处理以检测区域设置并转换为固定的C区域设置,然后才将其提供给QString::toDouble
。例如
QPair<double, bool> toDouble(QString in) {
auto dots = in.count('.');
auto commas = in.count(',');
if ((dots > 1 && commas > 1) || (dots == 1 && commas ==1))
// equivocal input
return qMakePair(0.0, false);
if (dots > 1 && commas <=1) {
// dots are group separators
in.replace(".", "");
in.replace(',', '.');
}
else if (dots <= 1 && commas > 1) {
// commas are group separators
in.replace(",", "");
}
else if (commas == 1) {
// assume commas are decimal points
in.replace(',', '.');
}
bool ok;
auto dbl = in.toDouble(&ok);
return qMakePair(dbl, ok);
}
QPair toDouble(Q串入){
自动点=英寸计数('.');
自动逗号=英寸计数(',');
如果((点>1&&逗号>1)| |(点==1&&逗号==1))
//模棱两可的输入
返回qMakePair(0.0,false);
如果(点>1&&逗号)