「2」、「٢」(U+0662、ARABIC-INDIC DIGIT TWO)、「Ⅱ」(U+2161、ROMAN NUMERAL TWO)など、数値を表す任意の Unicode 文字列があります。その文字列をintに変換したい。特定のロケールは気にしません (入力が現在のロケールにない可能性があります)。有効な数値であれば、変換する必要があります。
QString.toInt
とを試し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;
}
しかし、それは少しハックな気がします。また、すべての文字列に対して機能するわけではありません (たとえば、ローマ数字ですが、許容できる制限です)。異なるロケールでルールが競合するなど、そのようにする際に落とし穴はありますか (トルコ語と非トルコ語の大文字と小文字のルールを参照)。