Отформатируйте номер телефона и скройте #ERROR, когда возвращается null SSRS

У меня проблема, и все, что я пробовал, не работает. У меня есть поле данных номера телефона, которое возвращает числа без форматирования '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

Ошибка, которую вы получили, не имеет ничего общего с форматированием, это сбой преобразования в Double. Таким образом, ваше выражение работает идеально, если ваше поле полностью состоит из цифровых символов. Однако у вас есть некоторые данные с нечисловыми символами, в результате чего функция Convert.ToDouble() выдает ошибку.

К сожалению, это не может быть решено с помощью выражения IIF потому что IIF является функцией, а не языковой конструкцией, поэтому оба параметра - true и false - оцениваются перед передачей в функцию независимо от значения параметра логического условия. Это означает, что:

=IIF(IsNumeric(Fields!Phone.Value), Format(Convert.ToDouble(Fields!Phone.Value), "(000)000-0000"), 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), "(###)###-####"), 
    Fields!Phone.Value)
)

Это выражение возвращает 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), "(###)###-####")
  Else
    Return Phone
  End If
End Function

Используйте следующее выражение в ячейке вашего номера телефона:

=Code.FormatPhone(Fields!Phone.Value)