我有一个表示数字的任意 Unicode 字符串,例如“2”、“٢”(U+0662,阿拉伯印度数字二)或“Ⅱ”(U+2161,罗马数字二)。我想将该字符串转换为int。我不关心特定的语言环境(输入可能不在当前语言环境中);如果它是一个有效的数字,那么它应该被转换。
我试过QString.toInt
and QLocale.toInt
,但他们似乎没有完成工作。例子:
bool ok;
int n;
QString s = QChar(0x0662); // ARABIC-INDIC DIGIT TWO
n = s.toInt(&ok); // n == 0; ok == false
QLocale anyLocale(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
n = anyLocale.toInt(s, &ok); // n == 0; ok == false
QLocale cLocale = QLocale::C;
n = cLocale.toInt(s, &ok); // n == 0; ok == false
QLocale arabicLocale = QLocale::Arabic; // Specific locale. I don't want that.
n = arabicLocale.toInt(s, &ok); // n == 2; ok == true
有我缺少的功能吗?
我可以尝试所有语言环境:
QList<QLocale> allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
for(int i = 0; i < allLocales.size(); i++)
{
n = allLocales[i].toInt(s, &ok);
if(ok)
break;
}
但这感觉有点骇人听闻。此外,它不适用于所有字符串(例如罗马数字,但这是可以接受的限制)。这样做是否有任何陷阱,例如不同语言环境中的冲突规则(参见土耳其语与非土耳其语字母大小写规则)?