CStringの中から数字だけの場合と、その他が含まれる場合を識別する方法

このQ&Aのポイント
  • キーボードで入力された文字の中に数字以外の文字が含まれているかを識別する方法を知りたいです。
  • CString型からdouble型にキャストした後、数字だった場合は処理Aを実行し、それ以外の場合は処理Bを実行したいです。
  • 以下の条件を満たさない場合は識別を行いたくありません:(1) 数字とアルファベットなど数字以外の文字の混合 (2) 符号付の数字
回答を見る
  • ベストアンサー

CStringの中から数字だけの場合と、その他が含まれる場合を識別する方法

VC++6.0 MFCです。 CString についてなのですが、    キーボードで入力した文字(数字0~9、少数点.)を使って処理をしたいのですが、 キーボードで入力された文字の中にアルファベットなど、数字以外の文字が入っていた場合を 識別したいのですが、どのような方法がありますでしょうか? 下記のようにCString型 → doubl型にキャストして、数字だった場合は大小判定を して処理するのですが、アルファベットなどがある場合 double mojiDO = 0 に なってしまい、処理を初めてしまいます。 (1)数字とアルファベットなど数字以外の文字の混合はNG。(例"100gあ"はNG) (2)符号付の数字NG("-0.98"はNG) CString moji;//キーボード入力された文字が入っています。 double mojiDO = atof(moji);//CString型 → double型にキャスト if (mojiDO >= 0 && mojiDO <= 500 ){ //処理A } else if{ //処理B }

質問者が選んだベストアンサー

  • ベストアンサー
  • yukika-37
  • ベストアンサー率39% (26/66)
回答No.1

CString moji;//キーボード入力された文字が入っています。 char *e; double mojiDO = strtod(moji, &e);//CString型 → double型に変換 if (*e == '\0') {//条件(1)チェック   if (mojiDO >= 0) {//条件(2)チェック     if (mojiDO <= 500) {       //処理A     } else if(....) {       //処理B     }   } } 最低限こんな感じで動くのでは? (2)については、他にも処理の仕方あると思いますけど…。 (先頭がハイフンだったら処理しない、とか)

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtod.html
hagimoto
質問者

お礼

yukika-37さんありがとうございます。 期待する動作が得られました。 strtod()はatof()と違い文字列中に変換不可能な文字があった場合には、 その文字列のポインタを得られるのですね。    とても勉強になりました。

hagimoto
質問者

補足

条件に大文字の数字もNG と書き忘れてしまったのですが、大文字の数字についても、期待通りの結果が得られました。

関連するQ&A

  • CString にいれた値で"0"以外の数字があればメッセージを出したい

    CString にいれた値で"0"以外の数字があればメッセージを出したい お世話になります。 VC++6.0 MFCで開発しております。 CString atai; atai=kazu; ※kazuには不特定桁の数字が入っております。 if(ataiに"0"以外の数字がひとつでもあれば真) メッセージ としたいのですが、どのようにすれば、ataiの中の文字から0以外の数字がひとつでもあることを見つけれるでしょうか?? ※"0"があるかないかを調べたいのではなく、"0以外の"数字があるかないかを調べたいのです。 お手数ですが何卒よろしくお願いします。

  • CString型からdouble型への変換

    C++は初心者です。VC4.0を使っていますがMFCなどは使っていません。 CString型の変数をint型やlong型への変換はなんとかできたのですが、double型へ変換することができずに困っています。atofを使えばいいのだと思い下記のように記述したのですが、コンパイルするとエラーがでます。   CString sample = "0.234";   double i;   i = atof((const char*)sample); error C2440: 'type cast' : cannot convert from 'class CString' to 'const char *' どう直せば無事にdouble i に0.234を格納できるのでしょうか?よろしくお願いします。

  • Kシェルでgotoのような処理を作成したい。

    Kシェルでgotoのような処理を作成したい。 以下のような処理で、入力した文字が条件と一致しなかった場合、 再度、入力からやり直させるようにしたいです。 以下が例です。 NGになった場合、再入力を促したいです。 #!/bin/ksh echo "Input Moji ---> \c" read ans_Moji if [ ${ans_Moji == "入力した文字" ] ; then echo "OK" else echo "NG"  fi Windowsのようにgoto文があれば、簡単に出来るのですが、 シェルをはじめたばっかりでよく分かっておりません。 何かご存知でしたら、ご教授願います。

  • IF関数で数字とアルファベットが混ざった場合。

    セルの中が数字とアルファベットが混ざっている場合、IF関数は使えますか? 例えば、 A1に「3L123-1」 A2に「3H456-1」 A3に「3L789-10」 A4に「3F123-1」 と入力されていて、いちばん最初は3で決まっていますが、次のアルファベットは違う場合があり、次の123とか456の部分がいろいろな3桁の数字で、そのうち123だけを「合格」としたい場合です。 詳しい方、どうぞよろしくお願いいたします。

  • 入力値が1以下、かつ数字以外の文字の場合・・・

    皆様の知恵を貸してください!! 素数判定問題で、 「入力値が1以下、かつ数字以外の文字の場合、その旨 エラーメッセージとして表示&再入力させる」 という要求事項があるのですが… /* キーボードからの入力を受け付ける */ scanf("%d", &number); /**== 入力値をチェック ==**/ /* 入力値が1以下の場合、再入力を促す */ while(number <= 1) { printf("2以上の数を入力してください。\n"); } /* 入力値が数字以外の文字の場合、再入力を促す */ while(★) { printf("数字を入力してください。\n"); } 上記ソースの★のところになんと入れて良いかわかりません!! 課題の提出が明日なので…。 大至急、教えてください。よろしくお願いします!

  • VBScript 正規表現で入力された値を判定する

    初めまして。現在VBScriptでプログラムを組んでいるのですが、 どうしても詰まってしまいましたので、ご教授お願いします。 内容は、textboxに入力された値(textbox)を正規表現を用いて 半角数字のみtrue、数字以外の文字が含まれている場合はfalseを返したいと思っています。 if moji_check(textbox)=false then response.write "数字以外が入力されました。<br>"  else      Session("hensuu") = textbox end if function moji_check(strLen) if strLen.pattern("[^0-9]") then moji_check = true else moji_check = false end if end function という風に書いてみたのですが、実行してみると if strLen.pattern("[^0-9]") then 部分のstrLenがオブジェクトが無いと エラーが吐かれてしまいます。 このような場合の対処法を調べてみたのですが、プログラミング自体が不慣れなため わかりませんでした。 よろしくお願いいたします。

  • キャストについて str = (CString*)("999") ;

    環境 WIN98 VC++6.0 MFC にて いつもお世話になります。 先日質問したばかり(QNo.682705)なのですが、やはり納得できないことがあるのでお願いします。 分かっている人からみれば、おかしな疑問と思われるかも知れませんが、私にとっては素朴に疑問が生じてしまいます。 *************************** 以下2つのコードのうち、<A>は文法的にOKで<B>がNGな理由が知りたいです。 <A> CString* str ; str = (CString*)m_array.GetAt(i) ; //OK <B> CString* str ; str = (CString*)("999") ; //NG <A>は、m_arrayの要素にCString*を入れていて、初めて成り立つ式です。 と教わりましたが、むしろ私にはCString*以外が入っているため、CString*のキャストしていると思える。 CString*が入っているのなら、キャストする必要は無いのではないでしょうか? ネット上で見つけたコードなため、実際の値やm_arrayの宣言がどうなっているかは確認出来ません。 そして、<A>がおかしなコードでは無いという大前提にたつと、<A>は別の表現をすると <A> str = (CString*)(CString*以外のポインタ) ; となります。 そうすると<B>のコードも、"999"は999の文字列が入っているアドレスを指すポインタであるという考えが正しいとすると、 <B> str = (CString*)(999をさすポインタ) ; となり、おかしなコードではないと思えるのですが、考え方のどこがおかしいのでしょうか? ************************** 以下のことを教わった上であえて聞いています。 str = (CString*)("999"); は、リテラル文字列をつっこもうとしています。 リテラル文字列とCStringはまったく別物です。

  • 数字とアルファベットをタイピングする場合について。

    来月から仕事でパソコン入力業務をすることになっています。 打ち込むのは日本語の文章とかではなく、英語と数字のみです。 英語に混じって数字があるという感じです。 英語が多いところに数字があるところでは、 私は主にテンキーを使わず、英文を打つ指使いで、アルファベット上の数字を打っています。 なぜなら、アルファベットの途中でテンキーに手を移行させるのが面倒だからです。 しかし仕事でタイピングをされている方はどうしているのか知りたいと思いました。 アルファベットの途中で数字がある場合、テンキーに移行すべきか、 それほど数字ばかりでない場合は、アルファベットの上にある数字を打つ方がよいのか・・・。 もちろん数字がたくさんあるときは、テンキーを使った方が打つ速度は格段に速くなるとは思います。 (一応独学ではあるものの、タッチタイピングは習得しています) 数字の打ち方について回答お願いします。

  • VC++2008にてdouble型の置換について

    現在VC++2008をMFCにて開発しております。VC++は初心者です。 画面から入力される値(小数点以下有り)を ファイル名として利用し出力する為 小数点とマイナスを特定の文字列に置換する処理をおこなっております。 画面から入力される値(CString)をそのままatof変換し、 double型で取得しますと 「3000.00000」のような値になってしまいます。 「3000.10100」のような値も入力される可能性があるので 一慨に小数点以下を丸める事もできません。 そういった事を考慮しますと、どういった処理が考えられるでしょうか? ご教授頂ければ幸いです。

  • C言語の問題

    配列の問題 1.キーボードから入力したアルファベットの大文字(A~Z)の入力回数をそれぞれ数え、結果を画面出力するプログラムを作成せよ。但し、入力の終了はEOFとし、入力回数のカウントには、配列を用いるものとする。(文字ごとに回数を格納する配列を用意する) 2.キーボードから番号(数字)を入力し、その番号に該当する文字列中の文字を画面表示するプログラムを作成せよ。なお、数字以外の文字が入力した場合と、文字列の範囲外の数字が入力された場合は、任意のメッセージを出力し、再入力するようにする。また文字列はキーボードから入力するものとする。 この問題が解けなくて困ってます。どうか知恵をかしてください。

専門家に質問してみよう