Qt 为什么使用 QString::number() 而不是 QLocale().toString()?
Qt Why use QString::number() over QLocale().toString()?
我正在开发的应用程序将在许多国家推出,需要支持他们的语言。我一直在回顾我的代码并替换每个实例:
QString::number()
和 QString().toDouble()
和
QLocale().toString()
和 QLocale().toDouble()
我在网上没有找到太多比较这两个 类,但我对使用后者的影响很感兴趣,如果有 none - 为什么要使用 QString
函数?
本质上,我只是想确保在进行所有这些更改之前不会损害我的代码。有人知道吗?
QString
方法与语言环境无关:它们总是发生在 C
语言环境中。这在 I/O 未本地化时很有用,例如在应该可以跨区域移植的数据文件中 and/or 机器可读。
您绝对不应随意将 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);
}
在实际代码中,您希望不是孤立地而是作为一个集合来检查所有数字,并确保您可以检测到组分隔符和小数点的明确选择,否则您将不得不拒绝输入。
我正在开发的应用程序将在许多国家推出,需要支持他们的语言。我一直在回顾我的代码并替换每个实例:
QString::number()
和 QString().toDouble()
和
QLocale().toString()
和 QLocale().toDouble()
我在网上没有找到太多比较这两个 类,但我对使用后者的影响很感兴趣,如果有 none - 为什么要使用 QString
函数?
本质上,我只是想确保在进行所有这些更改之前不会损害我的代码。有人知道吗?
QString
方法与语言环境无关:它们总是发生在 C
语言环境中。这在 I/O 未本地化时很有用,例如在应该可以跨区域移植的数据文件中 and/or 机器可读。
您绝对不应随意将 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); }
在实际代码中,您希望不是孤立地而是作为一个集合来检查所有数字,并确保您可以检测到组分隔符和小数点的明确选择,否则您将不得不拒绝输入。