您遇到的错误与格式无关,而是转换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)