巴西合法账号binding

This commit is contained in:
renhaoting 2025-11-27 16:47:19 +08:00
parent 69efb79cfd
commit 65290af1ea
2 changed files with 102 additions and 0 deletions

View File

@ -0,0 +1,51 @@
package com.gamedog.vididin.features.withdraw
object BankUtil {
/**
* 验证输入的巴西CPF号码是否合法
*
* @param cpf 待验证的CPF字符串可以包含分隔符 XXX.XXX.XXX-XX或仅为纯数字
* @return 如果CPF格式正确且校验码有效则返回true否则返回false
*/
fun isValidCpf(cpf: String?): Boolean {
if (cpf.isNullOrBlank()) {
return false
}
// 1. 提取纯数字
val cleanCpf = cpf.replace("[^\\d]".toRegex(), "")
// 2. 初步格式验证必须是11位数字且不能所有数字相同如111.111.111-11
if (cleanCpf.length != 11 || cleanCpf.all { it == cleanCpf[0] }) {
return false
}
// 3. 计算并验证第一个校验位
val firstCheckDigit = calculateCheckDigit(cleanCpf, 9, 10)
if (firstCheckDigit != cleanCpf[9].toString().toInt()) {
return false
}
// 4. 计算并验证第二个校验位
val secondCheckDigit = calculateCheckDigit(cleanCpf, 10, 11)
return secondCheckDigit == cleanCpf[10].toString().toInt()
}
/**
* 计算CPF的校验位
*
* @param digits 纯数字的CPF字符串
* @param length 参与计算的前几位数字的长度
* @param weight 起始权重
* @return 计算出的校验位数字
*/
private fun calculateCheckDigit(digits: String, length: Int, weight: Int): Int {
var sum = 0
for (i in 0 until length) {
sum += digits[i].toString().toInt() * (weight - i)
}
val remainder = sum % 11
return if (remainder < 2) 0 else 11 - remainder
}
}

View File

@ -2,8 +2,12 @@ package com.gamedog.vididin.features.withdraw
import android.content.Context
import android.text.Editable
import android.text.TextWatcher
import androidx.core.view.isVisible
import com.ama.core.architecture.util.setOnClickBatch
import com.ama.core.architecture.widget.BindingDialog
import com.gamedog.vididin.R
import com.gamedog.vididin.databinding.DialogWithdrawBindingBankBinding as ViewBinding
import com.gamedog.vididin.router.Router
@ -29,6 +33,50 @@ class WithdrawBindBankDialog(context: Context) : BindingDialog<ViewBinding>(cont
}
}
}
tvCpfEdit.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
checkBankAccountValidation(s.toString())
}
override fun beforeTextChanged(
s: CharSequence?,
start: Int,
count: Int,
after: Int
) {
}
override fun onTextChanged(
s: CharSequence?,
start: Int,
before: Int,
count: Int
) {
}
})
}
checkBankAccountValidation("")
}
private fun checkBankAccountValidation(bankAccount: String) {
// TODO - forTesting- contain "B"
if (BankUtil.isValidCpf(bankAccount) || bankAccount.contains("B")) {
mBinding.ivState.isVisible = true
mBinding.ivState.setImageResource(R.mipmap.icon_success)
mBinding.tvConfirm.alpha = 1F
mBinding.tvConfirm.isClickable = true
} else {
mBinding.ivState.isVisible = !bankAccount.isEmpty()
mBinding.ivState.setImageResource(R.mipmap.icon_fail)
mBinding.tvConfirm.alpha = 0.3F
mBinding.tvConfirm.isClickable = false
}
}
@ -36,6 +84,9 @@ class WithdrawBindBankDialog(context: Context) : BindingDialog<ViewBinding>(cont
ownerActivity?.let { Router.Withdraw.startActivity(it) }
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
}
}