13

我遇到了问题,我尝试过的一切都不起作用。我有一个电话号码数据字段,它返回没有格式“3055558798”的数字,但我希望它看起来像这样“(305)555-8798”。我可以用这个表达式来完成:

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

唯一的问题是,当返回为空时,我会在空间中得到 #ERROR。我找到了一个摆脱 #ERROR 的表达式,但仍然没有运气将它们放在一起。我必须翻阅我的报告才能找到表达式,但希望有人可以帮助我。我已经做了几个月的报告,但我对所有的表达方式仍然不是很好。我只需要格式化电话号码,如果返回为空,则不显示任何内容。在我找到该表达式的同一个站点上也有这个,但它不起作用,所以我不知道为什么那个人说它对他有用。

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

这对我不起作用,我相信语法是错误的,但我不知道要改变什么来修复它。谢谢。

4

1 回答 1

31

您遇到的错误与格式无关,而是转换Double失败。因此,只要您的字段完全由数字字符组成,您的表达式就可以完美运行。但是,您有一些包含非数字字符的数据,导致Convert.ToDouble()函数抛出错误。

不幸的是,这不能用IIF表达式解决,因为IIF它是一个函数,而不是语言结构,因此无论布尔条件参数的值如何,true 和 false 参数都会在传递给函数之前进行评估。这意味着:

=IIF(IsNumeric(Fields!Phone.Value), Format(Convert.ToDouble(Fields!Phone.Value), "(###)###-####"), Fields!Phone.Value)

无论IsNumeric函数的结果如何,都将始终尝试转换为 double。有两种方法可以解决这个问题:

使用 Val 而不是 ToDouble

问题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 回答