pic*_*ips 2 qstring qt tostring type-conversion qlocale
我正在开发的应用程序将在许多国家推出,需要支持他们的语言.我一直在回顾我的代码并替换每个实例:
QString::number() 和 QString().toDouble()
同
QLocale().toString() 和 QLocale().toDouble()
我没有找到很多在线比较两个类,但我感兴趣的是使用后者的影响,如果没有 - 为什么要使用这些QString功能?
基本上我只想确保在进行所有这些更改之前我不会损害我的代码.有没有人有任何知识?
这些QString方法与语言环境无关:它们总是在C语言环境中发生.当I/O未本地化时,这很有用,例如,应该可以跨语言环境和/或机器可读移植的数据文件.
绝对不应该随意地QString用本地化的对应方式替换每种方法的使用QLocale!您需要确定应该本地化哪些用途:通常包括UI以及可能包含项目规范表明数字I/O应该本地化的一些文本文件I/O. 如果规范没有提到,那么首先修改规范是值得的,并记录面向用户文档中的行为.
以下注意事项适用于文本I/O.
对你接受的东西宽容,对你输出的东西保守.
用于人类消费的输出并不意味着机器可读用于数据提取,例如PDF和HTML报告文件,应具有本地化数字.
机器消耗的输出(例如CSV和XML文件)应使用C语言环境.
文本输入应允许选择所需的输入区域设置,并且应该是允许的.例如,当使用CSV时,既不使用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);
}
Run Code Online (Sandbox Code Playgroud)
在实际代码中,您需要检查所有不是孤立的数字,而是作为一个集合,并确保您可以检测到组分隔符和小数点的明确选择,否则您必须拒绝输入.