VC++ 6.0 MFCです。
CString型のエディットボックスに入力された文字列(数字)の大小
の比較を行いたいのですが、どのようにしたら良いでしょうか?
CString S1 = 12;
CString S2 = 101;
int X = S1.Compare(S2);
( S1=S2 ... X=0 S1<S2 ... X=-1 S1>S2 ... X=1 )
この方法では、数字の大小の判定はしてくれないのでしょうか?(ソート?)
CStringをINT型等にキャストして大小判定するしかないのでしょうか?
よろしくお願い致します。
CString S1 =0;
CString S2 =0000;
この二つの文字列 S1,S2 を比べたらどうなるでしょうか?
>CStringをINT型等にキャストして大小判定するしかないのでしょうか?
CStrig 型のものが INT 型にキャストできるということは本当ですか?
CStringの比較はあくまで文字列としての辞書順比較です。
数値として比較したいなら一旦数値に変換せんと。
逆順にして、0で拡張して、長さをそろえて、再度逆順に変換するとか。
文字列長で比較して、同じ場合のみ辞書順で比較するとか。
このあたりもありですね。
ただ、負の値の場合一文字目のチェックが必要となりますが。
その代わり何桁あっても大丈夫です。
ぬさんと同じ内容かもしれませんが…
A案
頭に0を付加して決まった桁数に調整する。
12--->0012
101--->0101
といった感じに。
B案
最初に文字数を比較し、文字数が異なるなら小さい方を小さい値とする。
文字数が同じ場合ならそのまま文字比較する。
>CString S1 =0;
>CString S2 =0000;
>この二つの文字列 S1,S2 を比べたらどうなるでしょうか?
S1<S2 ... X=-1
でした。
>CStrig 型のものが INT 型にキャストできるということは本当ですか?
CString S1 = 100;
int i = atoi( S1 );//CString → INT型に型変換
char *e;
double a = strtod(S1, &e);//CString型 → double型に変換
if (*e != '\0') { //数字以外の文字など異常を検出 }
しまさんの期待されていることとは違うのかもしれませんが
私は上記のようなことを考えてました。
しまさん、επιστημηさん、ぬさん、まにさん、
CStringのまま比較は桁数がそろっていないと出来ないのですね・・。
一旦文字を数字に変えて比較をしてみようと思います。
ありがとうございました。
#重箱の隅。
> int i = atoi( S1 );//CString → INT型に型変換
それはキャストじゃない。
>> int i = atoi( S1 );//CString → INT型に型変換
>
> それはキャストじゃない。
ですね。これは型変換ではなく、文字列-数値変換です。
型変換と言うのはデータの実体を変えずに型だけを変更する場合に
使う言葉ですね。
あと、
「CStringのまま比較は桁数がそろっていないと出来ないのですね・・。」
ではなくて、
文字列の比較と数値の比較は違うのだという事を認識した方が良いです。
わかりやすいのはエクスプローラーでファイル名でソートする機能がありますよね。
適当に作ったフォルダに消してしまってもよいファイルをコピーして
これを更にコピーしてファイルの数を増やします。
ファイル名を数字だけでつけてみてソートしてみると文字列比較の結果が
簡単に見れますよ。文字列の先頭から順に文字コードで比較していると
考えてみると理解できると思います。
蛇足ですが、数値として比較したり処理する事がメインの処理なら
内部では文字列ではなくて数値として取り扱った方が効率が良いです。
表示したり、出力する時に文字列にすれば、通常は文字列で保持して
おかなくても良いかもしれません。
#重箱の隅2
> わかりやすいのはエクスプローラーでファイル名でソートする機能がありますよね。
XPあたりから、数字で始まるファイル名は数値でソートされた気がする。
>> わかりやすいのはエクスプローラーでファイル名でソートする機能がありますよね。
>
> XPあたりから、数字で始まるファイル名は数値でソートされた気がする。
すみません、2バイト文字で数字で指定した時はXPでも同じですけれど、
1バイト文字だと数値でソートされてました。
確認してから書き込めばよかったなぁ。
たとえが悪かったかもなぁ。
さらに重箱の隅。
> XPあたりから、数字で始まるファイル名は数値でソートされた気がする。
さらに、レジストリを変更する事で旧式に戻せるらしい。
さらに、[15][5][1]などが末尾についていると辞書順だったりと訳がわからなくなり
そうです…
シャノンさん、PATIOさん、ぬさん
返事が遅くなってしまいました。
キャストの考え方が間違って覚えていました。
ありがとうございました。