Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions solutions/cpp/phone-number/1/phone_number.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include "phone_number.h"
#include <cctype>
#include <stdexcept>

using namespace std;

namespace phone_number {

void phone_number::validate_and_clean(const string& raw_input) {
string digits = "";

// 1. Filtrar y extraer únicamente los dígitos numéricos
for (char c : raw_input) {
if (isdigit(c)) {
digits += c;
} else if (isalpha(c)) {
// Si contiene letras, el número es inválido
throw domain_error("El número no puede contener letras");
}
}

// 2. Validar longitud y código de país (Prefijo 1)
if (digits.length() == 11) {
if (digits[0] != '1') {
throw domain_error("El codigo de pais no es 1");
}
// Si el prefijo es correcto nos quedamos con los 10 dígitos locales
digits = digits.substr(1);
} else if (digits.length() != 10) {
throw domain_error("Número de teléfono invalido");
}

// 3. Validar estructura NANP: NXX NXX-XXXX (Donde N es entre 2 y 9)
// El código de área no puede empezar con 0 o 1
if (digits[0] == '0' || digits[0] == '1') {
throw domain_error("El código de área no puede empezar con 0 o 1.");
}

// El código de central no puede empezar con 0 o 1
if (digits[3] == '0' || digits[3] == '1') {
throw domain_error("El código de central no puede empezar con 0 o 1.");
}

// Guardamos el resultado validado
m_cleaned_number = digits;
}

// Constructor
phone_number::phone_number(const string& raw_input) {
validate_and_clean(raw_input);
}

// Getter del número completo limpio
string phone_number::number() const {
return m_cleaned_number;
}

// Extrae los primeros 3 dígitos
string phone_number::area_code() const {
return m_cleaned_number.substr(0, 3);
}

}
24 changes: 24 additions & 0 deletions solutions/cpp/phone-number/1/phone_number.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once
#include <string>

namespace phone_number {

class phone_number {
private:
std::string m_cleaned_number;

// Función para aplicar las reglas estrictas de NANP
void validate_and_clean(const std::string& raw_input);

public:
// El constructor recibe la cadena sucia
explicit phone_number(const std::string& raw_input);

// Método de acceso al número limpio
std::string number() const;

// Getters de partes
std::string area_code() const;
};

}