13

問題が発生しており、試したすべてが機能しません。「3055558798」というフォーマットのない数字を返す電話番号データフィールドがありますが、この「(305)555-8798」のようにしたいです。次の式でそれを行うことができます。

= Format(Convert.ToDouble(Fields!MyFieldName.Value), "(###)###-####")

唯一の問題は、戻り値が null の場合、スペースに #ERROR が表示されることです。#ERROR を取り除いた式を見つけましたが、両方をまとめることができませんでした。レポートを掘り下げて表現を見つける必要がありますが、誰かが私を助けてくれることを願っています. 数か月間レポートを作成していますが、まだすべての表現がうまくできていません。電話番号をフォーマットするだけで、戻り値が null の場合は何も表示されません。私が表現を見つけたのと同じサイトにもこれがありますが、うまくいきません。

=Iif (Fields!MyFieldName.Value Is Nothing, Nothing, 
Format(Convert.ToDouble(Fields!MyFieldName.Value), "(###)###-####"))

それは私にはうまくいきません。構文が間違っていると思いますが、それを修正するために何を変更すればよいかわかりません。ありがとう。

4

1 に答える 1

31

あなたが得たエラーはフォーマットとは何の関係もありません.それはそれへの変換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)
于 2013-07-03T06:39:42.970 に答える