あなたが得たエラーはフォーマットとは何の関係もありません.それはそれへの変換Doubleが失敗していることです. したがって、フィールドが完全に数字で構成されている限り、式は完全に機能します。ただし、数値以外の文字を含むデータが含まれているため、Convert.ToDouble()関数がエラーをスローします。
IIF残念ながら、これは式では解決できません。これIIFは、言語構造ではなく関数であるため、ブール条件パラメーターの値に関係なく、真と偽の両方のパラメーターが関数に渡される前に評価されるためです。この意味は:
=IIF(IsNumeric(Fields!Phone.Value), Format(Convert.ToDouble(Fields!Phone.Value), "(###)###-####"), Fields!Phone.Value)
関数の結果に関係なく、常に double への変換を試みIsNumericます。これを解決するには、次の 2 つの方法があります。
ToDouble の代わりに Val を使用する
問題ToDoubleは、変換する文字列が不適切な形式の場合にエラーになることです。Valにはその問題はありません。取得できる数値を取得するだけです。したがって、次の式を使用できます。
=IIF(Fields!Phone.Value Is Nothing,
Nothing,
IIF(IsNumeric(Fields!Phone.Value),
Format(Val(Fields!Phone.Value), "(000)000-0000"),
Fields!Phone.Value)
)
(先頭のゼロが抑制されないように、# ではなく 0 を使用します)
この式はNothing、フィールドがNullである場合に を返します。数値であるかどうかを確認し、数値である場合は数値に変換してフォーマットします。それ以外の場合は、フィールドにあるものをそのまま返します。
Valフィールドが数値ではない場合でも関数は実行されますが、Val関数は のようなエラーを発生させないため、この式は成功することに注意してくださいToDouble。単純に計算を行い、結果を破棄します。
カスタムコード
Reportメニューで、 をクリックしReport Properties...てCodeタブに移動します。次のコードを挿入します。
Function FormatPhone(Phone AS String) AS String
IF (Phone Is Nothing) Then
Return Nothing
Else If (IsNumeric(Phone)) Then
Return Format(Convert.ToDouble(Phone), "(000)000-0000")
Else
Return Phone
End If
End Function
電話番号セルで次の式を使用します。
=Code.FormatPhone(Fields!Phone.Value)