任意格式化手机号、银行卡号

任意格式化手机号、银行卡号

废话不说,直接上代码

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
                )
            )
        }
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 老公, 我破了自己的记录,以往都是半个月喝完两桶水,这次10天就喝光了两桶水,大概是因为最近运动多喝水也多的缘故。...
    姜呈阅读 57评论 0 1
  • 8月14日 本月还剩下17天!本年还剩140天 看了那么多预制品,还是决定少点外卖!还是要每个月理发!!!!调整心...
    努力100天试试看阅读 45评论 0 0
  • 日记547 那份亲情 那份亲情是子艺和她爸爸的那份父女情。 其实怎么说呢?在2015年...
    梁渌淳阅读 41评论 0 0
  • 面相话别少年 我们的生活,大大小小总是一段修行,但我们却不是活在真空和理论之中的,总是会遇到各种各样不顺心的事,而...
    d32373120f13阅读 49评论 0 0
  • 广医三院荔湾|产检真的没你想的这么头大 🙋♀疯狂举手快👀 👀我! 谁说广三荔湾产检🙅不能轻松的 必须要告诉你们广医...
    VIP产检阅读 35评论 0 0