You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose TextField视觉转换:每3位数字加空格的OffsetMapping反向转换公式实现

解决Jetpack Compose TextField OffsetMapping反向转换问题

很棒的思路已经搞定了正向转换!我来帮你推导反向的transformedToOriginal公式,其实它比你想象的简单~

推导思路

先回顾你的正向转换逻辑:每3个原始数字字符后添加一个空格,所以每处理3个原始字符,转换后的字符串会多出1个空格位置(相当于3个原始字符对应4个转换后字符)。

反向转换的核心就是计算转换后的偏移位置前包含了多少个空格,然后用转换后的偏移减去空格数量,就能得到原始偏移。

观察你给出的正向映射示例,我们可以总结出规律:

  • 转换后的位置每经过4个字符(3数字+1空格),就会有1个空格
  • 空格的数量等于转换后偏移量除以4的整数结果(Kotlin中整数除法自动向下取整)

反向转换公式

基于上面的分析,反向转换的公式非常直接:

offset - (offset / 4)

验证示例

我们用你给出的正向映射来反向验证:

转换后偏移(transformed)计算过程原始偏移(original)是否匹配正向映射
00 - 0/4 = 00✔️
11 - 1/4 = 11✔️
22 - 2/4 = 22✔️
44 - 4/4 = 33✔️(正向3→4)
55 - 5/4 = 44✔️(正向4→5)
88 - 8/4 = 66✔️(正向6→8)
1212 - 12/4 = 99✔️(正向9→12)
1313 - 13/4 = 1010✔️(正向10→13)

完整代码

val phoneNumberOffsetTranslator = object : OffsetMapping {
    override fun originalToTransformed(offset: Int): Int {
        return (offset % 3) + (4 * (offset.div(3)))
    }
    override fun transformedToOriginal(offset: Int): Int {
        return offset - (offset / 4)
    }
}

这个实现也能正确处理光标在空格位置的情况:比如转换后偏移3(空格位置),计算得到3-0=3,对应原始偏移3,光标会自动对应到空格后的数字位置,符合输入预期。

内容的提问来源于stack exchange,提问作者Hussien Fahmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:27:45