Я строю проект MFC на C ++. У меня есть текстовое поле, в котором пользователь должен ввести число. Я могу преобразовать его в целое число, когда используется английская клавиатура. Но когда пользователь переключается на японскую клавиатуру, это не работает.
Я знаю, что японская клавиатура создает двухбайтовые символы. Но я не знаю, как преобразовать их в целое число.
Извините за недостаток информации.
Мое намерение состоит в том, чтобы проверить, является ли тип вводимых пользователей в текстовом поле числом или нет.
Но он не распознает номер с японской клавиатурой.
Я пробовал некоторые методы, такие как: strtol (), _wtoi.
Но результат (частота) всегда равен 0;
При отладке я получил строку 123 вместо 123456789.
Вот мой код
CString strFrequency;
GetDlgItem(IDC_EDIT_FREQUENCY)->GetWindowText(strFrequency);
if(strFrequency.IsEmpty()){
CDialog::OnOK();
return;
}
for(int i=1; i<strFrequency.GetLength(); i+=2) {
if(!std::isdigit(strFrequency[i])){
MessageBox("数字で入力してください。","発表支援");
return;
}
}
int frequency = atoi(strFrequency);
Все могут мне помочь?
заранее спасибо
CString strFrequency;
GetDlgItem(IDC_EDIT_FREQUENCY)->GetWindowText(strFrequency);
DWORD flags = LCMAP_HALFWIDTH;
const int size = strFrequency.GetLength() / 2 + 1;
char* s = new char[size];
ZeroMemory(s, size);
LCMapString(LOCALE_SYSTEM_DEFAULT,
flags,
strFrequency,
strFrequency.GetLength() + 1,
s,
size);
CString convertedText = s;
Я решил это. Строка (strFrequency) набирается японской клавиатурой полная ширина длина. Поэтому я преобразовал строку полной ширины в строку полуширины. Затем я могу проверить, является ли это числовой строкой или нет.
Без просмотра вашего кода, который пытается преобразовать число, и, по крайней мере, без подробного описания того, что на самом деле происходит, когда вы помещаете в него японский текст, будет довольно сложно сказать, что / почему не так. Пока что я могу думать только о том, что вы используете неправильный тип данных (то есть CHAR вместо WCHAR) или, возможно, вы пытаетесь анализировать японские символы, такие как ‘四万’, с помощью какого-то парсера только для арабского языка, такого как atoi () или, может быть, вы забыли правильно установить потоковую кодировку или локаль.
Пожалуйста, имейте в виду, что хотя японская клавиатура и японская локаль будут способны выдавать текст «40000», который, вероятно, будет разбираться с istringstream (и, возможно, даже будет с некоторой версией atoi), тогда почти наверняка японские цифры, такие как «四万» (это тоже 40000) скорее всего не будет анализироваться. Я думаю, что «四万» классифицируется как текст, а не цифры — но я могу быть очень неправ здесь! Я никогда не пробовал это. Но после небольшого поиска я не вижу никаких упоминаний о том, что это возможно.
Тем не менее, кажется, что есть некоторые способы для разбора цифр кандзи, см., Например, Как разобрать числовые символы кандзи с помощью ICU?
Если этот вызов компилируется и представляет японские символы,
MessageBox("数字で入力してください。","発表支援");
тогда кажется, что вы строите свой проект как ANSI, а не как UNICODE.
Попробуйте построить свой проект как UNICODE, изменив вызов на
MessageBox(L"数字で入力してください。",L"発表支援");