Verificando validade de cpf/cnpj em Kotlin

Verificando validade de cpf/cnpj em Kotlin

12/12/2019





Nesse tutorial vou mostrar a parte de Verificando validade de cpf/cnpj em Kotlin, para que você possa verificar se o cpf ou o cnpj são números possíveis.

Primeiramente vamos criar um projeto vazio(Empty) para fazer as mudanças e fazer a nossa verificação.

Se você ainda não sabe como criar um projeto vazio veja o tutorial Como criar um projeto no Android Studio.

Então vamos agora começar a modificar o nosso projeto para receber os valores para depois calcularmos o resultado.

Para isso vamos assim modificar o nosso arquivo de layout deixando da seguinte forma recebendo o valor via EditText.

activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Validar CPF/CNPJ"
        android:textSize="20sp"
        android:gravity="center"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/layCheck"/>
    <LinearLayout
        android:id="@+id/layCheck"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_margin="20dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Digite o cpf ou cnpj:"/>
        <EditText
            android:id="@+id/etNum"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"/>
        <Button
            android:id="@+id/btnCheck"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Verificar"/>
    </LinearLayout>
    <TextView
        android:id="@+id/tvCheck"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="20sp"
        app:layout_constraintTop_toBottomOf="@+id/layCheck"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Logo depois de fazer o nosso layout vamos agora fazer a nossa programação para que faça a validação do cpf/cnpj.

Então para isso utilizei uma máscara para quando o EditText tiver 11 até dígitos terá a máscara do cpf se tiver mais que 11 dígitos irá ter a máscara do cnpj.





Vamos programar assim da seguinte forma nossa MainActivity.

MainActivity

package br.com.uware.cpf_cnpj

import android.graphics.Color
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        etNum.addTextChangedListener(MaskEditUtil.mask(etNum))
        btnCheck.setOnClickListener {
            when(etNum.text.length){
                14 -> {
                    if(checkCpf(etNum.text.toString())){
                        tvCheck.text = "CPF válido"
                        tvCheck.setTextColor(Color.GREEN)
                    }
                    else{
                        tvCheck.text = "CPF inválido"
                        tvCheck.setTextColor(Color.RED)
                    }
                }
                18 -> {
                    if(checkCnpj(etNum.text.toString())){
                        tvCheck.text = "CNPJ válido"
                        tvCheck.setTextColor(Color.GREEN)
                    }
                    else{
                        tvCheck.text = "CNPJ inválido"
                        tvCheck.setTextColor(Color.RED)
                    }
                }
                else -> {
                    tvCheck.text = "Não é um CPF nem CNPJ válido."
                    tvCheck.setTextColor(getColor(R.color.colorAccent))
                }
            }
        }
    }
    fun checkCpf(et: String): Boolean{
        var str = et.replace("-", "").replace("/","").replace(".","")
        var calc: Int
        var num = 10
        var sum = 0
        for(x in 0..8) {
            calc = str[x].toString().toInt() * num
            sum += calc
            --num
        }
        var rest = sum % 11
        var test = 11 - rest
        if(test > 9) test = 0
        if(test != str[9].toString().toInt()) return false
        num = 11
        sum = 0
        for(x in 0..9) {
            calc = str[x].toString().toInt() * num
            sum += calc
            --num
        }
        rest = sum % 11
        test = 11 - rest
        if(test > 9) test = 0
        if(test != str[10].toString().toInt()) return false
        return true
    }
    fun checkCnpj(et: String): Boolean{
        var str = et.replace("-", "").replace("/","").replace(".","")
        var calc: Int
        var num = 5
        var sum = 0
        for(x in 0..11) {
            calc = str[x].toString().toInt() * num
            sum += calc
            --num
            if(num == 1) num = 9
        }
        var rest = sum % 11
        var test = 11 - rest
        if(test < 2) test = 0
        if(test != str[12].toString().toInt()) return false
        num = 6
        sum = 0
        for(x in 0..12) {
            calc = str[x].toString().toInt() * num
            sum += calc
            --num
            if(num == 1) num = 9
        }
        rest = sum % 11
        test = 11 - rest
        if(test < 2) test = 0
        if(test != str[13].toString().toInt()) return false
        return true
    }
    object MaskEditUtil {
        fun mask(ediTxt: EditText): TextWatcher {
            var isUpdating: Boolean = false
            var mask = ""
            var old = ""
            return object : TextWatcher {
                override fun afterTextChanged(s: Editable) {
                }
                override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
                }
                override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
                    val str = unmask(s.toString())
                    var mascara = ""
                    when (str.length) {
                        in 0..11 -> mask = "###.###.###-##"
                        else -> mask = "##.###.###/####-##"
                    }
                    if (isUpdating) {
                        old = str
                        isUpdating = false
                        return
                    }
                    var i = 0
                    for (m in mask.toCharArray()) {
                        if (m != '#' && str.length > old.length) {
                            mascara += m
                            continue
                        }
                        try {
                            mascara += str[i]
                        } catch (e: Exception) {
                            break
                        }
                        i++
                    }
                    isUpdating = true
                    ediTxt.setText(mascara)
                    ediTxt.setSelection(mascara.length)
                }
            }
        }
        fun unmask(s: String): String {
            return s.replace("-", "").replace("/","").replace(".", "")
        }
    }
}

Vamos agora compilar e executar o nosso projeto para ver como ficou.

Espero poder ter ajudado com mais este tutorial sobre Verificando validade de cpf/cnpj em Kotlin.

Veja também nossos vídeos.

Fonte: https://souforce.cloud/regra-de-validacao-para-cpf-e-cnpj/





Tags: , , ,

Autor Rodrigo Leutz
Rodrigo Leutz

Desenvolvedor Web e Android ( Kotlin e Java )