我遇到了问题,我尝试过的一切都无效。我有一个电话号码数据字段,返回没有格式'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), "(###)###-####"))
这对我不起作用,我认为语法错误但我不知道要修改什么来修复它。感谢。
答案 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)