tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: VB2005で通貨型(MDB)の扱い
投稿日: 2010/02/24(Wed) 17:30
投稿者魔界の仮面弁士
> 今回の現象はVB2005に上げた事が原因でしょうか?
幾つかの原因が予想できますが、手元に環境が無いのでこちらでは追調査できません。

先ほども書きましたが、最終的な書式は DataTable に取り込んだ後の型にも依存しますので、
気になるのであれば、実際のデータ型を確認してみてください。

データ型については、たとえば
 MsgBox(wDT.Columns("aaa").DataType.FullName)
 MsgBox(wDT.Rows(0)("aaa").GetType().FullName)
 MsgBox(TypeName(wDT.Rows(0)("aaa")))
などのようにして調べられます。

その結果、VB.NET2002 と VB2005 とで違いがあるかどうかを確認してみてください。
データ型が違うなら、そこを統一すれば同じような結果になるかも知れません。


一方で、同じ数値/同じデータ型でも、 ToString の結果が異なってしまうパターンも
存在します。たとえば Decimal 型の場合、小数点の後続のゼロも保持されているため、

 Dim a As Decimal = CDec("1.1")
 Dim b As Decimal = CDec("1.10")
 Dim c As Decimal = CDec("1.100")
 Label1.Text = a.ToString()
 Label2.Text = b.ToString()
 Label3.Text = c.ToString()

は、それぞれ同じ値(a = b AndAlso b = c)であるにも関わらず、上記は
それぞれ違う文字列が出力されることになります。

もちろん、書式を指定して、.ToString("0.0000") などとすれば同じにできますけれどね。



> lbll.Text = Cdec(wDT.Rows(0)("aaa")).Tostring("##0")
そんな感じです。

ちなみに、書式の「#」を記述しなくとも
  lbll.Text = CDec(wDT.Rows(0)("aaa")).ToString("0")
のようにすれば、小数部は出力されません。

あるいは、String.Format を使うこともできます。
  lbll.Text = String.Format("{0:0}", wDT.Rows(0)("aaa"))

String.Format の場合、上記のように CDec 等が不要となりますし、
桁数指定/右寄せ/左寄せなどの、より細かい制御も可能となります。


なお、書式化の際にはカルチャも明示した方が安全です。
(アプリケーションの仕様にもよりますが)


> 今回の件で痛感しました。今後はしっかり周知していこうと思います。
数値だけでは無く、日付もそうですね。

チェックを確実な物にするために、コントロールパネルの「地域と言語のオプション」を
 ・日付を和暦表示にした状態で動作させる。
 ・日本以外に設定した状態で動作させる。
というテストもしておく事をおすすめします。

特に前者は重要です。

たとえば和暦モードで運用しているユーザーの場合、
 TextBox1.Text = Now.ToString("yyyy/MM/dd")
の実行結果は、"2010/02/24" ではなく "22/02/24" になりますので、
地域設定のテストが不十分な場合、桁数がずれて処理されてしまうかも知れません。


一方、後者(日本以外に設定)する場面は、実運用上では可能性が低いですが、
関連する問題なので、一緒に抑えておいた方が良いでしょう。
このとき、地域設定をドイツにしておくと、日本との差異をテストし易いかと思います。


既定の【日付書式】
  日本:yyyy/MM/dd  あるいは gg yy/MM/dd
  米国:M/d/yyyy
 ドイツ:dd.MM.yyyy …日本とは、日付区切り記号も表記順も違う

既定の【数値書式】
  日本:123,456,789.012
  日本:123,456,789.012
 ドイツ:123.456.789,012 …日米とは、[小数点]と[桁区切り]の記号が逆

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。