タイトル : 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 …日米とは、[小数点]と[桁区切り]の記号が逆 |