あなたが得たエラーはフォーマットとは何の関係もありません.それはそれへの変換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)