返回为空SSRS时格式化电话号码并隐藏#ERROR

时间:2013-07-02 20:34:02

标签: reporting-services formatting phone-number

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

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

唯一的问题是当返回为null时,我在空间中得到#ERROR。我发现了一个表达式摆脱了#ERROR,但仍然没有运气将它们放在一起。我必须通过我的报告来找到表达,但希望有人可以帮助我。我已经做了几个月的报道,但我仍然不太满意所有的表达方式。我只需要格式化电话号码,如果返回为空则不显示任何内容。在同一个网站上我也找到了这个表达,但是它没有用,所以我不知道为什么这个人说它适合他。

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

这对我不起作用,我认为语法错误但我不知道要修改什么来修复它。感谢。

1 个答案:

答案 0 :(得分:28)

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

不幸的是,使用IIF表达式无法解决这个问题,因为IIF是一个函数,而不是语言结构,因此无论值是什么值,都会在传递给函数之前对true和false参数进行求值。布尔条件参数的。这意味着:

=IIF(IsNumeric(Fields!Phone.Value), Format(Convert.ToDouble(Fields!Phone.Value), "(###)###-####"), Fields!Phone.Value)
无论IsNumeric函数的结果如何,

总是会尝试将转换加倍。有两种方法可以解决这个问题:

使用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)