Предположим, что на форме расположен объект класса QStackedWidget, на страницах которого расположены объекты QTableView, отображающие различные данные. В один момент времени данные будут отображаться только в одном из виджетов QTableView (по одному на страницу stacked widget). Объявим модель для данных типа QSqlQueryModel: Продолжить чтение «Отображение данных выборки в виджете QTableView»
Рубрика: Базы данных
SVCenter. Автоматизация работы сервисного центра. C++Builder + MS SQL Server
SVCenter, Автоматизированная система обработки информации сервисного центра, г.Москва. Выполнена в C++Builder + MS SQL Server. Открыть исходное изображение.
Задачи системы:
- ведение (добавление, редактирование, удаление) данных
- регистрация работ с единицей техники от приема до выдачи клиенту, включая загрузку необходимых для работы фотографий
- составление соответствующей документации для печати (договоры, акты и пр.)
- экспорт необходимых данных в MS Excel
- ведение базы клиентов
- разделение уровней доступа к программе (администратор, начальник участка и пр.)
АС «Складской учет». C++ Builder + MySQL
Автоматизированная система «Складской учет» выполнена в среде разработки C++ Builder + СУБД MySQL. Учебный проект. Посмотреть изображение в полном размере.
Функции:
- Ведение (добавление, редактирование, удаление) данных БД
- Учет текущего количества товара на складе
- Поставка, отгрузка и возврат товара
- Формирование соответствующих актов для последующей печати.
Чтобы заказать проект или получить консультацию, перейдите, пожалуйста, на страницу Контакты.
Посмотрите другие работы — моё портфолио: https://secretsilent.ru/портфолио/
Инфо обо мне — давайте знакомиться! 🙂 https://secretsilent.ru/info/
ИС отдела материально-технического снабжения. Delphi + Interbase
ИС отдела материально-технического снабжения. Выполнена в Delphi + СУБД Interbase. Учебный проект. Изображение в полном размере.
Функции:
- Просмотр информации
- Ведение (добавление, редактирование, удаление) данных
- Создание печатных отчетов
- Разделение уровней доступа (администратор, сотрудник, сотрудник ОМТС)
Чтобы заказать проект или получить консультацию, перейдите, пожалуйста, на страницу Контакты.
Моё портфолио: https://secretsilent.ru/портфолио/
Познакомимся? 🙂 Инфо обо мне: https://secretsilent.ru/info/
Информационная система «Библиотека»: C++ Builder + MS Access
Информационная система «Библиотека». Выполнена в C++ Builder + Microsoft Access. Учебный проект. Изображение в полном размере.
Функции:
- Просмотр, поиск и фильтрация данных
- Ведение (добавление, редактирование, удаление) данных.
Чтобы заказать проект или получить консультацию, перейдите, пожалуйста, на страницу Контакты.
Моё портфолио: https://secretsilent.ru/портфолио/
Давайте знакомиться! Инфо обо мне: https://secretsilent.ru/info/
Способы выполнения запросов к базе данных в Qt
В записи Подключение к базе данных в Qt я описала, каким образом в Qt можно создать подключение к базе. Теперь рассмотрим такую базовую операцию, как запрос на выборку данных. Сначала необходимо подключить следующие классы:
[pastacode lang=»cpp» manual=»%23include%20%3CQSqlQuery%3E%0A%23include%20%3CQSqlError%3E%20%2F%2F%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2%0A%23include%20%3CQDebug%3E%20%2F%2F%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%BE%D0%B9%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8″ message=»» highlight=»» provider=»manual»/]
Пусть в базе данных имеется таблица следующего вида:
[pastacode lang=»sql» manual=»CREATE%20TABLE%20tableName%0A(%0A%20%20id%20integer%20NOT%20NULL%2C%0A%20%20fieldName%20character%20varying(100)%20NOT%20NULL%2C%0A%20%20CONSTRAINT%20entities_pkey%20PRIMARY%20KEY%20(id)%0A)» message=»Таблица в PostgreSQL» highlight=»» provider=»manual»/]
В программе необходимо произвести выборку значений из этой таблицы по какому-то критерию: fieldName должно содержать в себе подстроку «имя»:
Способ 1: QString
[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(QString(%22select%20*%20from%20tableName%20%22%0A%09%09%09%09%09%09%22where%20fieldName%20like%20’%251’%20%22%0A%09%09%09%09%09%20%20%20%22order%20by%20id%22).arg(%22%25%D0%B8%D0%BC%D1%8F%25%22)))%0A%09qDebug()%20%3C%3C%20query.lastError().text()%3B» message=»Через строку с параметрами» highlight=»» provider=»manual»/]
Задаем строку запроса, вместо изменяющихся величин задаем параметры через «%».
Способ 2: bindValue
[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aquery.prepare(%22select%20*%20from%20tableName%20%22%0A%09%09%09%22where%20fieldName%20like%20%3Aparam%20%22%0A%09%09%09%22order%20by%20id%22)%3B%0Aquery.bindValue(%22%3Aparam%22%2C%20QVariant(%22%25%D0%B8%D0%BC%D1%8F%25%22))%3B%0Aif%20(!query.exec())%0A%09qDebug()%20%3C%3C%20query.lastError().text()%3B» message=»Через bindValue» highlight=»» provider=»manual»/]
Преобразование QVariant() передаст в запрос параметр нужного типа.
Способ 3. addBindValue
[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aquery.prepare(%22select%20*%20from%20tableName%20%22%0A%09%09%09%22where%20fieldName%20like%20%3F%20%22%0A%09%09%09%22order%20by%20id)%3B%0Aquery.addBindValue(QVariant(%22%25%D0%B8%D0%BC%D1%8F%25%22))%3B%0Aif%20(!query.exec())%0A%09qDebug()%20%3C%3C%20query.lastError().text()%3B» message=»Через addBindValue» highlight=»» provider=»manual»/]
Здесь явно не указываются параметры. addBindValue последовательно по тексту запроса подставляет указанные значения параметров.
Qt. Динамическое создание виджетов на форме
Динамическое создание виджетов на форме может помочь, когда расположение и/или видимость виджетов подпадает под какие-то условия. Приведу пример. Допустим, в базе данных есть некая таблица, в которой хранятся настройки видимости, подписи, id наименований колонок основных таблиц базы, где хранятся важные данные:
[pastacode lang=»sql» manual=»CREATE%20TABLE%20table_settings%0A(%0Aid%20serial%20NOT%20NULL%2C%0Atable_id%20integer%20NOT%20NULL%2C%0Acolumn_id%20integer%2C%0Avisible%20boolean%20NOT%20NULL%20DEFAULT%20true%2C%0Acaption%20character%20varying(50)%2C%0Aname_%20character%20varying(50)%2C%0ACONSTRAINT%20table_settings_pkey%20PRIMARY%20KEY%20(id)%2C%0ACONSTRAINT%20table_settings_table_id_fkey%20FOREIGN%20KEY%20(table_id)%0AREFERENCES%20table_names%20(id)%20MATCH%20SIMPLE%0AON%20UPDATE%20CASCADE%20ON%20DELETE%20CASCADE%0A)» message=»» highlight=»» provider=»manual»/]
где
- id — ID записи п/п
- table_id — id таблицы, о колонках которой хранится информация
- visible — должна ли быть данная колонка видна
- caption — название колонки, которое задается пользователем
- name_ — наименование колонки, которое задается при создании таблицы
[pastacode lang=»sql» manual=»CREATE%20TABLE%20table_names%0A(%0Aid%20serial%20NOT%20NULL%2C%0Aname_%20character%20varying%20NOT%20NULL%2C%0ACONSTRAINT%20table_names_pkey%20PRIMARY%20KEY%20(id)%2C%0ACONSTRAINT%20table_names_name__key%20UNIQUE%20(name_)%0A)» message=»» highlight=»» provider=»manual»/]
А это, собственно, та таблица, где хранятся наименования таблиц, для которых нам надо выставить некие настройки.
Для динамического создания виджетов (пусть в нашем примере это будут виджеты классов QLabel и QLineEdit — подпись и поле ввода) на форме разместим объект QGridLayout, куда мы будем «пихать» виджеты. Я еще делаю такой трюк: помещаю в layout объекты в ряд в таком количестве, как хочу видеть результат:
Далее эти два виджета делаю невидимыми:
[pastacode lang=»cpp» manual=»ui-%3Elabel-%3EsetVisible(false)%3B%0Aui-%3ElineEdit-%3EsetVisible(false)%3B» message=»» highlight=»» provider=»manual»/]
Для того, чтобы не просто разместить виджеты на форме, но и потом брать из них информацию для наших нужд, объявим в отделе private класса формы объект класса QVector<QLineEdit*> lineEdits.
Теперь приступим непосредственно к динамическому созданию виджетов.
[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0A%2F%2F%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BC%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D1%83%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B8%D0%B7%20%D0%B1%D0%B0%D0%B7%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0Aif%20(!query.exec(QString(%22select%20column_id%2C%20caption%2C%20name_%2C%20visible%20from%20table_settings%20%22%0A%22where%20%22%0A%22table_id%20%3D%20(select%20id%20from%20table_names%20where%20%22%0A%22name_%20%3D%20’products’)%20%22%0A%22order%20by%20column_id%22)))%0AqDebug()%20%3C%3C%20query.lastError().text()%3B%20%0Awhile%20(query.next())%20%7B%20%0A%09QLabel%20*newLabel%20%3D%20new%20QLabel(this)%3B%20%2F%2F%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BA%D0%B8%20newLabel-%3EsetText(query.value(1).toString()%2B%22%3A%22)%3B%0A%09newLabel-%3EsetObjectName(%22label%22%2Bquery.value(2).toString())%3B%0A%09%2F%2F%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D1%8B%D0%B9%20%D0%B2%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%BE%D1%82%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20visible%20%D0%B2%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%0A%09newLabel-%3EsetVisible(query.value(3).toBool())%3B%0A%09%2F%2F%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B0%D0%B5%D0%BC%20%D0%B2%20layout%0A%09ui-%3EwidgetsLayout-%3EaddWidget(newLabel)%3B%20%2F%2FQGridLayout%0A%09QLineEdit%20*newEdit%20%3D%20new%20QLineEdit(this)%3B%0A%09newEdit-%3EsetObjectName(query.value(2).toString())%3B%0A%09newEdit-%3EsetVisible(query.value(3).toBool())%3B%0A%09ui-%3EwidgetsLayout-%3EaddWidget(newEdit)%3B%0A%09%2F%2F%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%20%D0%B2%20%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%0A%09lineEdits.push_back(newEdit)%3B%0A%7D%0A%2F%2F%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%B0%20%D1%84%D0%BE%D1%80%D0%BC%D1%8B%20%D0%B2%20%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8%20%D0%BE%D1%82%20%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BD%D0%B0%20%D0%BD%D0%B5%D0%B9%20%D0%B2%D0%B8%D0%B4%D0%B6%D0%B5%D1%82%D0%BE%D0%B2%0Athis-%3Eresize(this-%3EsizeHint())%3B» message=»» highlight=»» provider=»manual»/]
Чтобы обратится к отдельному объекту в векторе, достаточно указать его индекс:
[pastacode lang=»cpp» manual=»for%20(int%20i%20%3D%200%3B%20i%20%3C%20lineEdits.size()%3B%20%2B%2Bi)%0A%09qDebug()%20%3C%3C%20lineEdits%5Bi%5D-%3EobjectName()%20%3C%3C%20%22%20-%20%22%20%3C%3C%20lineEdits%5Bi%5D-%3Etext()%3B» message=»» highlight=»» provider=»manual»/]
Более элегантная и универсальная версия этого метода представлена здесь: Динамическое создание виджетов Qt. QGridLayout
Подключение к базе данных в Qt
Для подключения к базе данных нам необходимо включить в проект следующие классы:
[pastacode lang=»cpp» manual=»%23include%20%3CQMessageBox%3E%20%2F%2F%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8E%0A%23include%20%3CQSqlDatabase%3E%0A%23include%20%3CQSqlError%3E» message=»» highlight=»» provider=»manual»/]
QT += sql
[pastacode lang=»cpp» manual=»%2F*QPSQL%20-%20%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D1%82%D0%BE%D0%B9%20%D0%B8%D0%BB%D0%B8%20%D0%B8%D0%BD%D0%BE%D0%B9%20%D0%A1%D0%A3%D0%91%D0%94%2C%20%D0%B2%20%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%BC%20%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5%20-%20%D0%BA%20PostgreSQL%3B%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D0%B1%D0%B0%D0%B7%D0%B5%20MS%20SQL%20Server%20%D0%B2%D0%B0%D0%BC%20%D0%BD%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D0%BE%20%D1%81%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20ODBC*%2F%0A%0AQSqlDatabase%20db%20%3D%20QSqlDatabase%3A%3AaddDatabase(%22QPSQL%22)%3B%20%20%2F*%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D0%B0%20%D0%91%D0%94%20%D1%82%D0%B0%D0%BA%D0%B6%D0%B5%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C%20%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D1%83%20%D0%91%D0%94%3A%20addDatabase(%22QPSQL%22%2C%20%22myConnection1%22)%0A%D0%B8%D0%BC%D1%8F%20%D0%B8%D0%BB%D0%B8%20%D0%B0%D0%B4%D1%80%D0%B5%D1%81%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%2C%20%D0%B3%D0%B4%D0%B5%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%A1%D0%A3%D0%91%D0%94*%2F%0Adb.setHostName(%22localhost%22)%3B%0A%2F%2F%D0%B8%D0%BC%D1%8F%20%D0%B1%D0%B0%D0%B7%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0Adb.setDatabaseName(%22myDB%22)%3B%0A%2F%2F%D0%B8%D0%BC%D1%8F%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%0Adb.setUserName(%22user1%22)%3B%0A%2F%2F%D0%B5%D0%B3%D0%BE%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8C%0Adb.setPassword(%22123321%22)%3B%0A%2F*%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%3B%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%BD%D0%B5%D1%83%D0%B4%D0%B0%D1%87%D0%BD%D0%BE%20-%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BE%D0%B1%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B5*%2F%0Aif%20(!db.open())%0AQMessageBox%3A%3Acritical(NULL%2CQObject%3A%3Atr(%22%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%22)%2Cdb.lastError().text())%3B» message=»» highlight=»» provider=»manual»/]
При попытке подключения к базе данных PostgreSQL можно получить сообщение об ошибке «Driver not loaded». Это значит, что ваша система не может найти драйвер PostgreSQL. Необходимо в системный путь (PATH) вписать пути к папкам lib и bin вашей версии СУБД.
При удачном подключении к базе данных все обращения к базе в вашем проекте будут автоматически распознавать это подключение. Если подключение было задано без наименования подключения, то оно будет расцениваться как подключение по умолчанию. В проекте обязательно должно быть такое подключение, иначе получим ошибку. Работая с потоками в проекте для каждого потока должно быть свое подключение под своим именем.
Подключение к базе данных Microsoft SQL Server в Qt.
Инфо обо мне: https://secretsilent.ru/info/
SQLite, SQLiteStudio и отображение больших чисел в поле типа string в виде числа с плавающей точкой
В SQLite предусмотрено только 5 типов данных:
- NULL. Пустое значение в таблице базы.
- INTEGER. Целочисленное значение.
- REAL. Числовое значение с плавающей точкой.
- TEXT. Значение строки текста. Хранится с использованием кодировки базы данных (UTF-8, UTF-16BE или UTF-16LE).
- BLOB. Значение бинарных данных, хранящихся точно в том же виде, в каком были введены.
Однако некоторые менеджеры, позволяющие управлять базами данных SQLite, предоставляют нам возможность «большего» выбора. Так, SQLite Studio предоставляют выбор из следующих типов данных:
- bigint
- blob
- boolean
- char
- date
- datetime
- decimal
- double
- integer
- int
- none
- numeric
- real
- string
- text
- time
- varchar
Выходит, 17 против стандартных 5. Однако все эти 17 типов в конечном итоге приводятся все к тем же null, integer, real, text или blob. И каким образом после преобразования будут выглядеть данные решает SQLite, а не вы.
Например, в SQLite нет типа данных для хранения даты и времени. Однако есть встроенные функции SQLite для работы с этими типами данных. Для наглядности при создании столбца в разделе тип данных вы указываете datetime, но на самом деле данные будут храниться как тип данных text.
Итак, перейдем к теме. Задача: хранение кодов, состоящий из количества цифр >20, в поле базы строкового типа. Допустим, выбран тип string в SQLite Studio для решения данного вопроса:
[pastacode lang=»sql» manual=»CREATE%20TABLE%20Codes%20(%0Acode%20STRING%20(50)%20UNIQUE%20NOT%20NULL)%3B» message=»» highlight=»» provider=»manual»/]
Для строк 2222223333333333666666666999999999 и 1111111114444444444222222222333333333 в таблице вы увидете
Так, конечно же, не пойдет: код нужен целиком. Чтобы такие строки отображались корректно, необходимо использовать тип данных text, char, varchar (которые в конечном итоге приводятся к типу данных text):
Дело в том, что тип string будет приводится к типам real или integer, если данные похожи на вещественное или целое число, соответственно. Так, строка вида ‘0147’ преобразуется в ‘147’.