doubleを文字列にする際の右側のゼロを消したい。 – プログラミング – Home

doubleを文字列にする際の右側のゼ...
 
通知
すべてクリア

[解決済] doubleを文字列にする際の右側のゼロを消したい。


ぴろ
 ぴろ
(@ぴろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

はじめまして。

double dVal = 5.0;
CString strTemp;
strTemp.Format(_T(%.f), dVal);

上記を行った場合、strTempは「5.00000000」となるのですが、
コレを「5」のように、右側のゼロを表示しないようにするには
どうしたらよいのでしょうか。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

右から順に一文字ずつ消せばいいんじゃないすか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

てか、そもそもマニュアル読んだ?

http://msdn.microsoft.com/ja-jp/library/0ecbz014(VS.80).aspx


返信引用
ぴろ
 ぴろ
(@ぴろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

やはり、右からみて、「0」か「.」だったら消していくという方法に
なるのですか。

一応、上記はやっているのですが、もっと手軽な方法があればと思い、
質問して見ました。

マニュアルは一応見てから質問させていただきました。
が、ご指摘を受けたという事は、理解不足で、実はそういったことが
できると書いているのでしょうか。。。

もう一度みてみます。


返信引用
ぴろ
 ぴろ
(@ぴろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

マニュアルを読み直し、

strTemp.Format(_T(%.f), dVal);

ではなく、

strTemp.Format(_T(%.g), dVal);

を使うと良さそうだという事がわかりました。
が、自信がもてないので、今回のような場合には「(%.g)」を使う
という認識に間違いがないか、どなたかご指摘いただけると嬉しいです。

よろしくお願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

追試したんですけど、ひろさんとは結果が異なります。

/* Visual Studio 2005(=VC++8)
* cl -EHsc -MD -D_AFXDLL formatTest.cpp
*/

#include <afx.h>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
double dVal = 5.0;
CString strTemp;
const char* format[] = { [%.f], [%.0f], [%2.2f], [%3.5f], [%5.3f],
0 };
for ( int i = 0; format[i] != 0; ++i ) {
strTemp.Format(format[i],dVal);
cout << setw(10) << format[i] << static_cast<const char*>(strTemp) << endl;
}
}

--- 実行結果 ---
[%.f][5]
[%.0f][5]
[%2.2f][5.00]
[%3.5f][5.00000]
[%5.3f][5.000]


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> 今回のような場合には「(%.g)」を使うという認識に間違いがないか

なぜやってみないんだろう。ほんの数行コード書くだけやん。

#include <afx.h>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
double dVal = 5.0;
CString strTemp;
const char* format[] = {
[%.e], [%.0e], [%2.2e], [%3.5e], [%5.3e],
[%.f], [%.0f], [%2.2f], [%3.5f], [%5.3f],
[%.g], [%.0g], [%2.2g], [%3.5g], [%5.3g],
0 };
for ( int i = 0; format[i] != 0; ++i ) {
strTemp.Format(format[i],dVal);
cout << setw(10) << format[i] << static_cast<const char*>(strTemp) << endl;
}
}


返信引用
ぴろ
 ぴろ
(@ぴろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

επιστημη さん

追試、ありがとう御座居ます。
そして、大変恐縮ですが、私の記入にミスがありました。

「strTemp.Format(_T(%.f), dVal);」

ではなく、

「strTemp.Format(_T(%f), dVal);」 (%とfの間に.はない)

を行っています。

変更も下記にしています。
「strTemp.Format(_T(%g), dVal);」


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CStringクラスのFormat関数で使用する書式文字列の中身は
printfの書式と同じだったと思います。

で、MFCが使える環境なんですからMSDNも使えるのではないかと
思います。いわゆるHELPと言う奴です。
これでprintfを調べて、書式文字列に関してリンクを辿ってみれば、
必要な情報は出てきますので確認してみてください。
もしくは、printfの書式ならC言語の入門書とかにも載っていそうです。

さらに書籍やMSDNで調べた事を実際にコードを書いて試して見ます。
これが大事です。
読んだだけだと理解したつもりになってしまいます。
実際にやって見て動作を確認しつつ、更に調べると言うことを
繰り返して勉強して行くと良いと思います。


返信引用
ぴろ
 ぴろ
(@ぴろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

PATIOさん、επιστημηさん

ありがとうございます。
ご助言をもとに、勉強していきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました