0

C++ で MFC プロジェクトを作成しています。ユーザーが数値を入力するテキストフィールドがあります。英語キーボードを使用すると、整数に変換できます。しかし、ユーザーが日本語キーボードに切り替えると、機能しません。

日本語キーボードが 2 バイト文字を作成することは知っています。しかし、それらを整数に変換する方法がわかりません。

情報不足ですみません。

私の意図は、テキストフィールドに入力されたユーザーが数字であるかどうかを確認することです。ただし、日本語キーボードでは番号を認識しません。strtol()、_wtoi など、いくつかの方法を試しました。しかし、結果 (頻度) は常に 0 です。デバッグ時に取得した文字列は、123456789 ではなく 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);

誰もが私を助けることができますか?

前もって感謝します

4

3 に答える 3

0

この呼び出しがコンパイルされ、日本語の文字が表示される場合、

MessageBox("数字で入力してください。","発表支援");

UNICODE ではなく ANSI としてプロジェクトをビルドしているようです。

呼び出しを次のように変更して、プロジェクトを UNICODE としてビルドしてみてください。

MessageBox(L"数字で入力してください。",L"発表支援");
于 2013-04-08T12:52:55.333 に答える
0

数値を変換しようとするコードが表示されず、日本語のテキストを入力したときに実際に何が起こるかについての大まかな説明がなければ、何が/なぜ間違っているのかを判断するのは非常に困難です。今のところ、私が考えることができる唯一のことは、間違ったデータ型を使用している (つまり、WCHAR ではなく CHAR) か、「四万」のような日本語の記号を、atoi() のようなアラビア語のみのパーサーで直接解析しようとしているということです。 、またはストリーム エンコーディングまたはロケールを適切に設定するのを忘れた可能性があります。

日本語キーボードと日本語ロケールは、おそらく istringstream で解析可能な「40000」のテキストを生成できますが (おそらく、一部の atoi バージョンでも解析可能です)、ほぼ確実に「四万」のような日本語の数字が生成されることに注意してください。 (これも 40000 です)おそらく解析されません。「四万」は数字ではなくテキストとして分類されていると思いますが、ここでは非常に間違っている可能性があります! 私はそれを試したことがない。しかし、少し検索した後、これが可能であるという言及は見当たりません。

ただし、漢字数字を解析する方法もいくつかあるようです。たとえば、ICU を使用して漢字数字を解析する方法を参照してください。

于 2013-04-08T08:14:16.937 に答える