我有一個任意的Unicode字符串,表示一個數字,例如「2」,「2」(U + 0662,ARABIC-INDIC DIGIT TWO)或「Ⅱ」(U + 2161,ROMAN NUMERAL TWO)。我想將該字符串轉換爲一個int。我不關心特定的語言環境(輸入可能不在當前語言環境中);如果它是一個有效的數字,那麼它應該被轉換。將任何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;
}
但是,這感覺稍微的hackish。此外,它不適用於所有字符串(例如羅馬數字,但這是一個可以接受的限制)。這樣做時是否有任何缺陷,例如不同地區的衝突規則(參見土耳其語與非土耳其語信件的規則)?
在不知道輸入語言環境的情況下執行此操作可能很危險。如果相同的字符在不同的語言環境中表示不同的數字值會發生什麼?我們不知道所有的語言,這就是爲什麼我們不能假設它們中沒有一個具有不同含義的重疊數字字符串。 –
這是假設的,還是有這樣的情況的實例? –
這只是沒有任何意義。如果你看到一個說英語的用戶輸入一個字符與一箇中文數字相匹配,那麼不要*假設他學會了如何說漢語並掌握使用IME。假設他輸入了錯誤的數據,即99.9%的情況。 –