Sintaxe
M
fnValidaCPF(CPF as any) as nullable logicalParâmetros
- CPFanyObrigatório
CPF formatado, sem formatação ou numérico. Coluna numérica tem o zero à esquerda reposto.
M"123.456.789-09"
Tipo de retorno
nullable logical
Exemplos
M
fnValidaCPF("123.456.789-09")
// true
fnValidaCPF("123.456.789-00")
// false (dígito errado)
fnValidaCPF("111.111.111-11")
// false (sequência repetida)Código completo
M
let
fnValidaCPF = (CPF as any) as nullable logical =>
let
vTexto =
if CPF = null then null
else if CPF is number then Text.PadStart(Text.From(Number.Abs(CPF), "en-US"), 11, "0")
else if CPF is text then CPF
else Text.From(CPF),
vDigitos = Text.Select(vTexto ?? "", {"0".."9"}),
vNumeros = List.Transform(Text.ToList(vDigitos), Number.FromText),
// Pesos decrescentes a partir de (tamanho + 1); resto 10 vira 0
fnDigito = (base as list) as number =>
let
vSoma = List.Sum(List.Transform(List.Positions(base), (i) => base{i} * (List.Count(base) + 1 - i))),
vResto = Number.Mod(vSoma * 10, 11)
in
if vResto = 10 then 0 else vResto,
vDV1 = fnDigito(List.FirstN(vNumeros, 9)),
vDV2 = fnDigito(List.FirstN(vNumeros, 9) & {vDV1})
in
// "and" para no primeiro false: vNumeros{9} só é lido com 11 dígitos
if vTexto = null then null
else Text.Length(vDigitos) = 11
and List.Count(List.Distinct(vNumeros)) > 1
and vDV1 = vNumeros{9}
and vDV2 = vNumeros{10},
Documentacao = [
Documentation.Name = "fnValidaCPF",
Documentation.Description = "Valida um CPF pelos dígitos verificadores.",
Documentation.LongDescription = "Aceita CPF formatado (123.456.789-09), sem formatação ou numérico. Rejeita sequências repetidas (111.111.111-11). Entrada null retorna null.",
Documentation.Category = "Validação",
Documentation.Author = "Paulo André Jesus",
Documentation.Version = "2.0",
Documentation.Examples = {
[Description = "CPF válido", Code = "fnValidaCPF(""123.456.789-09"")", Result = "true"],
[Description = "Dígito errado", Code = "fnValidaCPF(""123.456.789-00"")", Result = "false"],
[Description = "Sequência repetida", Code = "fnValidaCPF(""111.111.111-11"")", Result = "false"]
}
]
in
Value.ReplaceType(fnValidaCPF, Value.ReplaceMetadata(Value.Type(fnValidaCPF), Documentacao))Mais informações
- Fonte
- Paulo André Jesus — OfficeTuning
- Versão
- 2.0