[ Вопрос дня ] Как преобразовать строку в число

При переходе с платформы 1С версии 7.7 на версию 8.Х у программистов часто возникают вопросы из-за особенностей новой платформы. Иногда это касается даже самых простых функций, которые в новой версии платформы работают совершенно по-другому. С одной из таких особенностей столкнулся наш слушатель.

Вопрос

Есть код:

Если Число(Данные77.Уровень) = 12 Тогда
КонецЕсли;

Реквизит Данные77.Уровень всегда тип «Строка». При выполнении кода выдается ошибка «Преобразование значения к типу Число не может быть выполнено». В 1С 7.7 всегда преобразовывалась строка в число. Как сделать то же самое в 8-ке?

Ответ тренера

Если параметр функции «Число» не является строковым представлением числа, система выдаст ошибку.

В синтакс-помощнике подробнее расписано:

Можно воспользоваться вот такой конструкцией:

Попытка
    ТекЧисло = Число(ТекстовоеПоле);
Исключение
    ТекЧисло = 0;
КонецПопытки;

Тогда если в переменной ТекстовоеПоле будет не строковое представление числа, возникнет ошибка, которую мы обработаем, например, присвоим переменной ТекЧисло значение 0.

Комментарии / обсуждение (6):

  1. Олег Петухов

    в своЁ время тоже сталкивался с ошибками преобразования строки в число. в моих случаях ошибки возникали из-за того, что:
    – в строковом представлении число разделялось на триады, а в качестве символа разделения мог быть как обычный пробел (код символа 32), так и неразрывной пробел (код символа 0160);
    – в строковом представлении дробная часть отделялась от целой части либо точкой, либо запятой.
    если заранее известно, что в строковом представлении всегда указано только число и никаких иных символов и знаков, то преобразовать строку в число можно одной строкой, несколько раз обернув строку через функцию СтрЗаменить, например так:
    Число (СтрЗаменить (СтрЗаменить (СтрЗаменить (стрЧисло, ” “, “”), ” “, “”), “,”, “.”));
    где сначала в ” ” используется обычный пробел, а во втором ” ” – неразрывной пробел.

    примечание: в зависимости от региональных настроек базы (в конфигураторе пункт «Региональные установки информационной базы» в меню «Администрирование») или ОС (если в региональных настройках информационной базы установлена галка «Использовать региональные установки текущего сеанса») в качестве разделителя триад может выступать и запятая.
    эти моменты надо заранее учесть, чтоб верно указать что и на что в строке надо заменить до преобразования строки в число.

  2. Сергей

    Еще есть такой вариант
    ОписаниеТипа = Новый ОписаниеТипов(“Число”);
    Текчисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);

    • Василий Ханевич

      Добрый день!
      Да, хороший вариант.
      Преимущество такого способа в том, что не вызывается исключение, когда в ТекстовоеПоле содержится не строковое представление числа.
      Например:

      ТекстовоеПоле = "курсы-по-1с.рф";
      ОписаниеТипа = Новый ОписаниеТипов("Число");
      ТекЧисло = ОписаниеТипа.ПривестиЗначение(ТекстовоеПоле);

      После выполнения такого кода ТекЧисло = 0.

      А подобный код вызывает ошибку выполнения:

      ТекЧисло = Число("курсы-по-1с.рф");
    • Igor_K

      Да, на сайте ИТС в #std499 п.3.7 явно указано, что подобная конструкция приведения к типу с помощью исключения является нарушением стандартов разработки.

      • Василий Ханевич

        Добрый день!
        Да, есть такая рекомендация в стандартах разработки.

        На практике исключения часто используются для решения подобных задач.
        Например, при помощи исключения можно обработать использование ошибочной строки, присвоить произвольное значение в случае возникновения ошибки, выдать сообщение:

        Попытка
            ТекЧисло = Число(ТекстовоеПоле);
        Исключение
            ТекЧисло = -999;
            Сообщить("!");
        КонецПопытки;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.