■動 作 環 境 :WindowsNT4.0
■開 発 環 境 :Visual C++6.0(SDI形式,MFC使用)
■データベース:Access2000(ODBC接続)
---------------------------------------
お世話になります。質問させて下さい。
▼やりたい事 ¥1,000 → ¥1,000
AccessのフィールドデータをそのままでVC++のフォーム上に文字列として表示したい。
Accessのフィールド設定:通貨型データ( ’¥ ’と ’,’が 自動で付いてくる)
これを ¥ も ,(桁区切り)も付けたままで表示したいのですが・・・。
---------------------------------------
▼現状 ¥1,000 → 1000.000
GetFieldValue で CString にデータを取って来ると ’¥ ’と ’,’が消えており、
おまけに、小数点以下第三位まで表示される。
---------------------------------------
これは自分で ’¥ ’を先頭に付加したりするしかないのですか?
’¥ ’はエスケープ文字だからですかね?・・・。
’¥ ’付加は Format で自分でもできますけど、桁区切りはどうすればよいのでしょうか?
宜しくお願いします。
もともとアクセスが持ってるデータは、1000.000ですよ。
単価とか、金額でも小数点以下が必要なことがあるのです。
表示するときはACCESS君がかしこく整形して出してくれてるだけです。
ACCESS内だと、設定すれば赤字とかにもなりますよね。同じです。
やれるとすれば、フィールドの設定を解読することでしょうか・・・。
ひっぱってこれるのかな??
どちらにせよ、表示時の整形は自分でやるしかないと思います。
>桁区切りはどうすればよいのでしょうか?
文字列操作で3桁毎にカンマを挿入すればいいでしょう。
お世話になっております。
不良PGさん、いもちぃさん ありがとうございます。
そういう事だったんですね。後は自分で整形します。
お世話になりました、という事で私の作成したコードを例として載せますね。
今回は必要な桁は7桁まででしたので、7桁までしかやってないです。
● Access2000 で入力した値 = 1,000(数値)
▼ VC++ で取ってきた文字列 = 1000.000(文字列)
■ 構築したい文字列 = ¥1,000(文字列)
-------------------------------------
レコードセット.GetFieldValue(フィールド名,文字列型変数);
整数型変数 = atoi(文字列型変数);
文字列型変数.Format(%d,整数型変数);
switch(文字列型変数.GetLength())
{
case 4:
文字列型変数.Insert(1,,);
文字列型変数.Insert(0,¥¥);
break;
case 5:
文字列型変数.Insert(2,,);
文字列型変数.Insert(0,¥¥);
break;
case 6:
文字列型変数.Insert(3,,);
文字列型変数.Insert(0,¥¥);
break;
case 7:
文字列型変数.Insert(1,,);
文字列型変数.Insert(5,,);
文字列型変数.Insert(0,¥¥);
break;
}
※ 画面上で分かり易くする為に ’¥’と ’,’は全角文字にしてます。
※7桁目以降は2、3、・・・ 個目のカンマ位置に注意が必要です。1個挿入したら1桁分ズ
レルから・・・。
以上ですー。
> ※7桁目以降は2、3、・・・ 個目のカンマ位置に注意が必要です。1個挿入したら1桁
分ズ
>レルから・・・。
右のほうから挿入していけばズレないのでは?
CString szBuff1, szBuff2, szBuff3;
szBuff1 = _T(1234567890.000);
int nIdx = szBuff1.Find('.');
if ( nIdx > -1 )
szBuff1 = szBuff1.Left(nIdx);
while ( szBuff1.GetLength() > 3 ) {
szBuff2 = szBuff1.Right(3);
szBuff1 = szBuff1.Left(szBuff1.GetLength()-3);
if ( szBuff3.IsEmpty() )
szBuff3 = szBuff2;
else
szBuff3 = szBuff2 + _T(,) + szBuff3;
}
if ( szBuff1.IsEmpty() )
szBuff3 = _T(\\) + szBuff3;
else
szBuff3 = _T(\\) + szBuff1 + _T(,) + szBuff3;
面白そうなので俺も参加。
#コンパイル確認してません。
CString IntToCurrency(int n)
{
CString result;
LPCTSTR prefix = _T(\\);
if(n < 0)
{
prefix = _T(-\\);
n = -n;
}
result.Format(_T(%d), n);
int figure = 3:
int commas = (result.GetLength() - 1) / figure;
int index = (result.GetLength() - 1) % figure + 1;
while(commas--)
{
result.Insert(index, _T(','));
index += figure + 1;
}
result = prefix + result;
return result;
}
値と表示用文字列を返すメソッドを持つクラスを作成したほうが
すっきりしていいかもしれませんね。
皆様の色々なやり方がありますね。
どれがいいかは私には分かりませんけど、自分と違うコードは参考になります。
また宜しくお願いします。
駄犬さん、
その通りですね。先に右から挿入すればいいですね。
ありがとうございます。