任意格式化手机号、银行卡号
废话不说,直接上代码
import android.text.Editable
import android.text.Selection
import android.text.TextWatcher
import android.widget.EditText
open class FormatTextWatcher
@JvmOverloads
constructor(
private val editText: EditText?,
private val separatorSizes: IntArray,
private val separator: String = " ",
private val maxLength: Int = -1,
) : TextWatcher {
/**
* 是否正在格式化
*/
private var isFormatting = false
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
}
@Synchronized
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
if (isFormatting) {
return
}
val plainNumber = s.toString().replace(separator.toRegex(), "")
val text = formatNumber(plainNumber, separatorSizes, maxLength)
isFormatting = true
editText?.setText(text)
isFormatting = false
}
override fun afterTextChanged(s: Editable) {
Selection.setSelection(s, s.length)
}
private fun formatNumber(
value: CharSequence,
separatorSizes: IntArray,
maxLength: Int
): CharSequence {
val formattedNumber = StringBuilder()
var segmentCount = 0 // 记录当前段已添加的字符数量。
var segmentIndex = 0 // 当前段的位置
val length = if (maxLength in 1..<value.length) {
maxLength
} else {
value.length
}
for (i in 0 until length) {
formattedNumber.append(value[i])
segmentCount++
if (segmentCount == separatorSizes[segmentIndex] && i + 1 < length && segmentIndex < separatorSizes.size - 1) {
formattedNumber.append(' ')
segmentCount = 0
segmentIndex++
}
}
return formattedNumber.toString()
}
companion object {
@JvmStatic
val PHONE = intArrayOf(3, 4, 4)
@JvmStatic
val CARD_CODE = intArrayOf(4, 4, 4, 3)
@JvmOverloads
@JvmStatic
fun formatPhone(
editText: EditText?,
separator: String = " ",
maxLength: Int = 11
) {
editText?.addTextChangedListener(
FormatTextWatcher(
editText,
PHONE,
separator,
maxLength
)
)
}
@JvmOverloads
@JvmStatic
fun formatCardCode(
editText: EditText?,
separator: String = " ",
maxLength: Int = 19
) {
editText?.addTextChangedListener(
FormatTextWatcher(
editText,
CARD_CODE,
separator,
maxLength
)
)
}
@JvmOverloads
@JvmStatic
fun format(
editText: EditText?,
separatorSizes: IntArray,
separator: String = " ",
maxLength: Int = -1,
) {
editText?.addTextChangedListener(
FormatTextWatcher(
editText,
separatorSizes,
separator,
maxLength
)
)
}
}
}
网友评论