12


2

CDblは何をしていますか?

最近まで、VB.NETでの `CDbl(x)`操作は本質的にキャスト(つまり、C#の `(double)x`に相当するVB)であるという印象を受けていました。しかし、最近の発見はこれが事実ではないことを明らかにしました。

この文字列があるとします。

Dim s As String = "12345.12345-"

そして、私はこれを行います:

Dim d As Double = CDbl(s)

「d」は値「-12345.12345」に設定されます! 誤解しないでください、これは私の特定のシナリオで便利です。しかし、これがうまくいく理由について私が混乱していることを認めざるを得ません。 特に、私は混乱しています:

  • `Double.Parse`は上記の入力では機能しません。

  • 「Double.TryParse」は機能しません。

  • 「Convert.ToDouble」は機能しません。

「CDbl」はどのように賢いのですか?

3 Answer


15


Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble()を使用します。 この関数には、オブジェクトのGetTypeCode()戻り値に関するSelectステートメントが含まれているため、引数の型に基づいてカスタムコンバーターを使用できます。 文字列コンバーターは、文字列に通貨値が含まれている可能性を考慮し、文字列に対して何らかの処理を行ってそれを処理します。 通貨値に許可される形式の1つは、末尾の負符号です。

これは特に安くはありません。 同じ変換を達成する最も簡単な方法は次のとおりです。

Dim s As String = "12345.12345-"
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)


1


これは常にVisual Basic 4/5/6の `CDbl()`の動​​作であり、現在はVB.NET固有のものです(フレームワークの一部ではなく、インラインです)。 。

(https://en.wikipedia.org/wiki/QBasic[QBasic]から購入した機能が原因で、.NET Visual Basicより前の奇妙さのようです。)


0


[コントロールパネル]の[地域のオプション]に移動すると、数字の前ではなく後ろにマイナス記号を付けることができる設定があります。

どのシステムが数字の後にマイナス記号を使用するのかわかりませんが、CDblは両方を受け入れるようにプログラムされているようです。 あなたが受け入れること、そしてそのすべてにおいて寛大になりなさい。

地域オプションには、カッコ内の負の数の設定もあります。 それは動作しますか? -CDbl("(12345.12345) ")