手机号与银行卡的规范显示
同一列手机号,有人写 13800138000,有人写 138-0013-8000,还有人带 +86 前缀。做报表时看着乱,统计也容易错。这篇讲怎样在不改原始数据的前提下,把展示和统计都做对。
一、先判断底层是文本还是数字
点单元格看编辑栏:编辑栏显示原样数字且左对齐,是文本;右对齐,多半是数值。
两种类型要两套写法,先统一再处理最省事:
=VALUE(A2) ' 文本转数值
=TEXT(A2,"0") ' 数值转文本
二、分段显示:优先用自定义格式
数值型手机号,分段显示用单元格自定义格式最干净,因为它只是"看起来"变了,值还是原值:
Ctrl+1 → 自定义 → 000-0000-0000
银行卡 19 位按 4 位一组:
0000 0000 0000 0000 000
用函数也能做,但 TEXT 返回的是文本,结果不能再直接参与求和:
=TEXT(A2,"000-0000-0000")
要保留数值参与计算,就用自定义格式;要输出到别处,才用 TEXT。
三、脱敏打码
对外提供名单时保留前 3 后 4:
=LEFT(A2,3)&"****"&RIGHT(A2,4)
想让结果保持 11 位长度,用 REPLACE:
=REPLACE(A2,4,4,"****")
银行卡只露后四位:
="**** **** **** "&RIGHT(A2,4)
打码生成新列。直接改原列,后面想核对都无从下手。
四、去掉 +86 和杂字符
通讯录、系统导出常带前缀和分隔符,先清洗再判断长度:
=TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"+86",""),"-","")," ",""))
清洗完检查是否合规:
=IF(AND(LEN(B2)=11,LEFT(B2,1)="1",ISNUMBER(--B2)),"正常","异常")
--B2 确认全是数字,出现字母会报错,被 AND 判为假。
五、按号段粗分归属
不用查号段库,先看前三位:
=IFERROR(LOOKUP(--LEFT(A2,3),{130;131;132;133;145;150;151;152;153;155;156;157;158;159;166;170;171;173;175;176;177;178;180;181;182;183;184;185;186;187;188;189;198;199},{"联通";"联通";"联通";"电信";"联通";"移动";"移动";"移动";"移动";"联通";"联通";"移动";"移动";"移动";"联通";"虚拟";"虚拟";"电信";"联通";"移动";"联通";"电信";"移动";"移动";"移动";"电信";"联通";"移动";"移动";"联通";"移动";"移动";"移动";"联通";"移动"}),"未知号段")
号段表会变,这套写法适合粗分。真要精确归属,得接号段数据源。
六、导入时别被改格式
导入 CSV 后号码变科学计数法,是导入时没指定列类型。两个做法:
- 用"数据 → 从文本/CSV"导入,向导里把该列显式设为文本;
- 已经导坏的,回源数据重导——数值转科学计数法后精度已丢,公式救不回来。
录入时加数据验证限制长度:
允许:文本长度 等于:11
长度不对会直接弹提示,比事后查省力。
七、常见坑
| 现象 | 原因 | 处理 |
|---|---|---|
| 号码末位变 0 | 数值精度不足 | 改文本后重录 |
TEXT 结果无法求和 | 返回文本 | 用自定义格式,或外层 VALUE |
| 打码后发现原表也变了 | 直接改了原列 | 用公式生成新列 |
带 +86 判长度为 13 | 未清洗前缀 | 先 SUBSTITUTE 再判定 |
八、速查
| 需求 | 写法 |
|---|---|
| 分段显示(不改变值) | 自定义格式 000-0000-0000 |
| 手机号打码 | =REPLACE(A2,4,4,"****") |
| 保留首尾 | =LEFT(A2,3)&"****"&RIGHT(A2,4) |
| 去前缀 | =SUBSTITUTE(A2,"+86","") |
| 合规判断 | =IF(AND(LEN(B2)=11,LEFT(B2,1)="1"),"正常","异常") |
判断类型这一步别省。同一列里文本和数值混着放,后面任何一步聚合都会出错。