Форматирование строки с номером телефона C++

Рейтинг: -4Ответов: 2Опубликовано: 17.05.2023

запутался и ничего не понял. Нужно из строки "+79995553311" Сделать строку "+7(999)555-3311"

Запутался в индексах substr();

void Worker::formatting_numberPhone() {
    formatted_numberPhone = "(" + number_phone.substr(0, 3) + ")"
        + number_phone.substr(3, 3) + "-" + number_phone.substr(6, 4);
}

void Worker::getData() {
    formatting_numberPhone();
    std::cout << name << ' ' << subname <<
        "\nNumber phone: " << formatted_numberPhone << "\nCompany: " << company << "\nid: " << id;
}

Буду благодарен за помощь!

Ответы

▲ 3Принят

Что-то Вы странное написали с индексам, поэтому давайте попробуем заново составить форматирование. Разберем Ваш номер:

+79995553311

Вы хотите получить из него строку

+7(999)555-3311

Смотрим. Перед скобкой должны оставаться два первых символа. Параметры substr имеют следующий смысл: первый - индекс начала подстроки, второй - количество символов в подстроке. Индексы начинаются с нуля. Тогда первые два символа мы получим так:

number_phone.substr(0, 2)

В скобках стоят три символа, начиная с индекса 2 (помним, что индекс первого элемента - 0). Значит нам нужно следующее:

number_phone.substr(2, 3)

После скобок до дефиса стоит три символа. Получаем их:

number_phone.substr(5, 3)

После дефиса стоит оставшаяся часть строки, начиная с 9 символа. Поэтому так:

number_phone.substr(8, 20)

Почему 20? Чтобы получить весь остаток строки, независимо от длинны номера. Как это работает, оставлю Вам для самостоятельного разбора.

В итоге получим следующую строку:

    formatted_numberPhone = number_phone.substr(0, 2) + "(" 
        + number_phone.substr(2, 3) + ")" + number_phone.substr(5, 3) +  "-" +number_phone.substr(8, 20);
▲ 2

Тут нужно начинать с конца, поскольку код страны может быть двузначным, а может и трёхзначным, и плюса там может не быть.

#include <iostream>
#include <stdexcept>
    

std::string format_phone(const std::string& phone) {
    // Минимальный размер номера. Например: 89995553311
    if (phone.size() < 11)
        throw std::length_error{"Invalid phone length"};

    return std::string{phone.begin(),phone.end()-10}
         + "(" + std::string{phone.end()-10,phone.end()-7} + ")"
         + std::string{phone.end()-7,phone.end()-4} + "-"
         + std::string{phone.end()-4,phone.end()};
}

int main() {
    std::cout << format_phone("+79995553311") << std::endl;
    return 0;
}

А вообще, самым эффективным спосбом будет сначала зарезервировать phone.reserve(phone.size()+4) и затем через insert добавлять разделители.