1

コンテキスト:VB.NETで記述され、VisualStudio2012で開発/保守され、フレームワークv3.5を対象とするプログラム。

数年前、プログラムはVB(6)にあり、VB.NETに「変換」しました。ほとんど自動化された変換の結果として、テキスト表示のdouble(およびdates / ...)のフォーマットが次のように処理されるコード内の場所がまだかなりあります。

Dim sValue As String = Microsoft.VisualBasic.Compatibility.VB6.Format(dblValue, "0.00")

逆に、そのような文字列からDouble値を抽出する必要がある場合は、

Dim dblValue As Double = CDbl(sValue)

CDblは、アプリケーションスレッドのSystem.Globalization.CultureInfo.CurrentCultureを「リッスン」します。これは、コードの実行中にコントロールパネルから地域設定を変更しても変更されません。

ただし、コードで実行されるVB6.Formatは、(ご想像のとおり)アプリケーションのcurrentCultureに準拠し始めますが、どうやら(私はこれを知りませんでしたが、誤って見つけました)、地域設定の変更をリッスンし、プログラムの実行中に行った変更に即座に応答します。これは、CDbl()とVB6.Format()が相互に不整合になることを意味します。

もちろん、プログラムの実行中に地域設定を変更するのは厄介です。さらに、それをサポートしたい場合は、SystemEvents.UserPreferenceChanged(および-Changing)イベントをキャッチして、それらの発生に基づいて動作することで管理できます。

ただし、VB6.FORMATの「異なる動作」とCDbl(someString)としての「通常の」キャストの文化/地域設定の変更に関しては、望ましくないと思います。できれば、VB6.Formatを常にapplication / thread-CurrentCultureに準拠させる必要があります。次に、ユーザー設定の変更にコードをどのように応答させるかを選択できます。さらに、この問題についてもう少し洞察を得たいと思います。

したがって、私の質問は次のとおりです。(Microsoft.VisualBasic.Compatibility。)VB6.Formatがアプリケーションをリッスンするようなものをコンパイル/アレンジ/...する方法はありますか-CurrentCultureそして応答しません-「私たちの同意」なしで-地域設定の変更に?

追加情報:プログラムは、C:\ Windows \ Microsoft.Net \ Framework \ V2.0.50727 \ Microsoft.VisualBasic.Compatibility.dll(および..)へのプロジェクト(VisualStudio2012)の参照を使用してコンパイルされます。 .Data.dll)。

「教育的な」情報や提案は大歓迎です。この問題は私たちのプログラムに実際の問題を引き起こしていませんが、私たちは物事をより堅牢にするためのより良い理解とおそらく方法さえも持っているべきであると感じています。

4

1 に答える 1

1

VB6 Format()関数は、実際には内部のオペレーティングシステム関数です。VarFormat()、oleaut32.dllによってエクスポートされた関数。背景説明の答えはここにあります。MSDNライブラリの記事はこちらです。

MSDNの記事からわかるように、この関数では、曜日のルール以外のカルチャまたはカルチャ固有の設定を指定することはできません。この関数は1996年にさかのぼり、当時の生活ははるかに単純でした。したがって、表示される内容は簡単に説明できるようになり、.NETThread.CurrentCulture設定については何もわかりません。

于 2012-10-20T11:23:28.703 に答える