Code Library

M · UDF

fnTelefoneAnonimo

Mascara telefone fixo ou celular brasileiro, mantendo o DDD, os dois primeiros e os dois últimos dígitos. Aceita código do país (55), prefixo de discagem (0) e código de operadora.

Categoria: Máscara de dadosTipo: UDFVersão: v2.1Fonte: Paulo André Jesus — OfficeTuningAtualizado em: 27/09/2026
Documentação completa na Function Library →

Sintaxe

fnTelefoneAnonimo(telefone as nullable text) as nullable text

Argumentos

NomeTipoObrigatórioDescrição
telefonenullable textSimTelefone em qualquer formatação; aceita código do país 55, prefixo 0 e código de operadora.

Retorno

nullable text

Código completo

let
    fnTelefoneAnonimo = (telefone as nullable text) as nullable text =>
        let
            vDigitos = Text.Select(telefone ?? "", {"0".."9"}),
            vTam = Text.Length(vDigitos),
            // Código do país: 55 + 10 dígitos (fixo) ou 55 + 11 (celular)
            vSemPais =
                if List.Contains({12, 13}, vTam) and Text.StartsWith(vDigitos, "55")
                then Text.End(vDigitos, vTam - 2)
                else vDigitos,
            vTamSemPais = Text.Length(vSemPais),
            // DDD nunca começa com 0: um 0 inicial é prefixo de discagem.
            // 0 + DDD + número = 11 ou 12 dígitos; 0 + operadora (2) + DDD + número = 13 ou 14
            vNacional =
                if Text.StartsWith(vSemPais, "0") and List.Contains({11, 12}, vTamSemPais)
                then Text.End(vSemPais, vTamSemPais - 1)
                else if Text.StartsWith(vSemPais, "0") and List.Contains({13, 14}, vTamSemPais)
                then Text.End(vSemPais, vTamSemPais - 3)
                else vSemPais,
            vDDD = Text.Start(vNacional, 2),
            vInicio = Text.Middle(vNacional, 2, 2),
            vFim = Text.End(vNacional, 2)
        in
            if Text.StartsWith(vNacional, "0") then null   // DDD inválido
            else if Text.Length(vNacional) = 10 then "(" & vDDD & ") " & vInicio & "**-**" & vFim
            else if Text.Length(vNacional) = 11 then "(" & vDDD & ") " & vInicio & "***-**" & vFim
            else null,

    fnTelefoneAnonimoTipo = type function (
        telefone as (type nullable text meta [
            Documentation.FieldCaption = "Telefone",
            Documentation.FieldDescription = "Telefone em qualquer formatação. Aceita +55, prefixo 0 e código de operadora; outros tamanhos retornam null."
        ])
    ) as nullable text meta [
        Documentation.Name = "fnTelefoneAnonimo",
        Documentation.Description = "Mascara telefone fixo ou celular, mantendo DDD, dois dígitos iniciais e dois finais.",
        Documentation.LongDescription = "Considera só os dígitos da entrada. Descarta o código do país 55, o prefixo de discagem 0 e o código de operadora (0 + 2 dígitos). Depois disso, 10 dígitos = fixo e 11 = celular; outros tamanhos, ou DDD começando com 0, retornam null.",
        Documentation.Category = "Máscara de dados",
        Documentation.Author = "Paulo André Jesus",
        Documentation.Version = "2.1",
        Documentation.Examples = {
            [Description = "Fixo", Code = "fnTelefoneAnonimo(""(11) 3221-1234"")", Result = """(11) 32**-**34"""],
            [Description = "Celular com país", Code = "fnTelefoneAnonimo(""+55 21 98765-4321"")", Result = """(21) 98***-**21"""],
            [Description = "Prefixo 0", Code = "fnTelefoneAnonimo(""(021) 3221-1234"")", Result = """(21) 32**-**34"""],
            [Description = "Código de operadora", Code = "fnTelefoneAnonimo(""0 15 11 98765-4321"")", Result = """(11) 98***-**21"""],
            [Description = "Inválido", Code = "fnTelefoneAnonimo(""123456"")", Result = "null"]
        }
    ]
in
    Value.ReplaceType(fnTelefoneAnonimo, fnTelefoneAnonimoTipo)

Exemplos

fnTelefoneAnonimo("(11) 3221-1234")
// "(11) 32**-**34"

fnTelefoneAnonimo("+55 21 98765-4321")
// "(21) 98***-**21"

fnTelefoneAnonimo("(021) 3221-1234")
// "(21) 32**-**34"  (prefixo 0 descartado)

fnTelefoneAnonimo("0 15 11 98765-4321")
// "(11) 98***-**21"  (prefixo e operadora descartados)

fnTelefoneAnonimo("123456")
// null

Dicas e observações

⚠️ Até a versão 2.0, o prefixo 0 não era removido: "(021) 3221-1234" tinha 11 dígitos, virava "celular" e saía "(02) 13***-**34"; com código de operadora, o resultado era null. 💡 DDD nunca começa com 0, então um 0 inicial é sempre prefixo de discagem. 💡 Depois das remoções, 10 dígitos = fixo; 11 = celular. Outros tamanhos retornam null. ⚠️ Mascarar não é anonimizar no sentido da LGPD: com parte dos dígitos à vista, o dado ainda pode identificar a pessoa.