Accessのデータ \1,000 を VC++でそのまま表示したいのですが。

[戻る]
takeshi 2002/05/28(火) 17:28:16
■動 作 環 境 :WindowsNT4.0
■開 発 環 境 :Visual C++6.0(SDI形式,MFC使用)
■データベース:Access2000(ODBC接続)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
  お世話になります。質問させて下さい。


▼やりたい事     ¥1,000  →  ¥1,000

AccessのフィールドデータをそのままでVC++のフォーム上に文字列として表示したい。

  Accessのフィールド設定:通貨型データ( ’¥ ’と ’,’が 自動で付いてくる)

これを ¥ も ,(桁区切り)も付けたままで表示したいのですが・・・。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

▼現状           ¥1,000  →  1000.000

GetFieldValue で CString にデータを取って来ると ’¥ ’と ’,’が消えており、
おまけに、小数点以下第三位まで表示される。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

これは自分で ’¥ ’を先頭に付加したりするしかないのですか?
 ’¥ ’はエスケープ文字だからですかね?・・・。

 ’¥ ’付加は Format で自分でもできますけど、桁区切りはどうすればよいのでしょうか?
                 宜しくお願いします。

いもちぃ 2002/05/28(火) 17:49:35
もともとアクセスが持ってるデータは、1000.000ですよ。
単価とか、金額でも小数点以下が必要なことがあるのです。
表示するときはACCESS君がかしこく整形して出してくれてるだけです。
ACCESS内だと、設定すれば赤字とかにもなりますよね。同じです。

やれるとすれば、フィールドの設定を解読することでしょうか・・・。
ひっぱってこれるのかな??

どちらにせよ、表示時の整形は自分でやるしかないと思います。

不良PG [E-Mail] 2002/05/28(火) 17:57:00
>桁区切りはどうすればよいのでしょうか?
文字列操作で3桁毎にカンマを挿入すればいいでしょう。

takeshi 2002/05/28(火) 18:14:06
[[解決]]
  お世話になっております。

不良PGさん、いもちぃさん ありがとうございます。
そういう事だったんですね。後は自分で整形します。

takeshi 2002/05/28(火) 19:56:35
[[解決]]
  お世話になりました、という事で私の作成したコードを例として載せますね。
今回は必要な桁は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桁分ズ
レルから・・・。

以上ですー。

駄犬 [E-Mail] 2002/05/28(火) 20:06:47
>  ※7桁目以降は2、3、・・・ 個目のカンマ位置に注意が必要です。1個挿入したら1桁
分ズ
>レルから・・・。

右のほうから挿入していけばズレないのでは?

臨時の先生 2002/05/28(火) 20:38:29
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;

pie 2002/05/29(水) 03:12:00
面白そうなので俺も参加。
#コンパイル確認してません。

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;
}

べーちゃん 2002/05/29(水) 07:18:48
値と表示用文字列を返すメソッドを持つクラスを作成したほうが
すっきりしていいかもしれませんね。

takeshi 2002/05/29(水) 10:20:57
[[解決]]
  皆様の色々なやり方がありますね。

どれがいいかは私には分かりませんけど、自分と違うコードは参考になります。
また宜しくお願いします。

  駄犬さん、
その通りですね。先に右から挿入すればいいですね。
ありがとうございます。

古いスレッドには追加発言できません。