Форматирование строки с номером телефона C++
запутался и ничего не понял. Нужно из строки "+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;
}
Буду благодарен за помощь!
Ответы (2 шт):
Что-то Вы странное написали с индексам, поэтому давайте попробуем заново составить форматирование. Разберем Ваш номер:
+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);
Тут нужно начинать с конца, поскольку код страны может быть двузначным, а может и трёхзначным, и плюса там может не быть.
#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 добавлять разделители.