知识库外链:https://t6ixa9nyl6.jiandaoyun.com/sharedoc/17VjvmzrzRAx5H9Ztt47DL
表单外链: https://slc5umd6bu.jiandaoyun.com/f/605336125b761700071ccd29
应用安装链接:https://jiandaoyun.com/a/5ea8076bcfdfea0006062a29("文本数字的拆分"表单)
一、问题背景
在进销存等场景内,用户会在单行文本扫码录入产品信息,扫码结果是文本+数字,文本是产品的名称,数字是产品的型号,需要扫码录入后,自动把文本+数字拆分成2个字段,分别记录文本数字。
已知条件:单行文本的内容为文本+数字,文本长度不固定,数字长度不固定。比如单行文本内容为“平车001”或者“工铲2146”。
需要实现:把文本+数字拆分到2个文本字段内,分别显示文本和数字。比如分别拆分成:字段1内容为”平车“,字段2内容为“001”。
二、解决思路
文本+数字的长度不固定,文本的长度不固定,数字的长度也不固定,两者之间没有固定符号间隔,唯一的已知条件为:数字的开头为0、1、2、3、4、5、6、7、8、9中的一个。那么如下思路我们可以进行文本+数字的拆分:
1、获取第一位数字所在位置
2、第一位数字的所在位置-1==文本部分长度,用LEFTT(单行文本,文本部分长度)获取文本内容
3、单行文本总长度-文本部分长度==数字部分长度,用RIGHT(单行文本,数字部分长度)获取数字内容
三、思路解析
1、获取数字部分长度:由于数字的开头肯定是0、1、2、3、4、5、6、7、8、9中的一个,因此只需要分别SEARCH这10个数字在文本内的位置,取最小的位数就可以确定第一位数字的位数,但是需要注意,取最小位数的时候有2种情况:
(1)数字内包含0、1、2、3、4、5、6、7、8、9内的所有数字,此时只需要对10位数字一一SEARCH,取SEARCH()的最小值就可以,即:MIN(SEARCH('0',输入内容),SEARCH('1',输入内容),SEARCH('2',输入内容),SEARCH('3',输入内容),SEARCH('4',输入内容),SEARCH('5',输入内容),SEARCH('6',输入内容),SEARCH('7',输入内容),SEARCH('8',输入内容),SEARCH('9',输入内容))
(2)数字内包含0、1、2、3、4、5、6、7、8、9内的部分数字,即部分SEARCH的结果等于0,且有可能多个值等于0,此时我们应该取位数的第二小,即:SMALL(UNION([SEARCH('0',输入内容),SEARCH('1',输入内容),SEARCH('2',输入内容),SEARCH('3',输入内容),SEARCH('4',输入内容),SEARCH('5',输入内容),SEARCH('6',输入内容),SEARCH('7',输入内容),SEARCH('8',输入内容),SEARCH('9',输入内容)]),2)
那么怎么判断数字包含0、1、2、3、4、5、6、7、8、9内的所有数字还是部分数字呢?包含部分数字字的时候,SEARCH结果肯定会有等于0的,反之,SEARCH结果没有等于0的,则表示数字部分包含0、1、2、3、4、5、6、7、8、9内的所有数字。因此,可以通过如下公式判断包含的是所有数字:COUNTIF([SEARCH('0',输入内容),SEARCH('1',输入内容),SEARCH('2',输入内容),SEARCH('3',输入内容),SEARCH('4',输入内容),SEARCH('5',输入内容),SEARCH('6',输入内容),SEARCH('7',输入内容),SEARCH('8',输入内容),SEARCH('9',输入内容)],'0')==0
2、获取文本部分内容
第一位数字的所在位置-1==文本部分长度,用LEFTT(单行文本,文本部分长度)获取文本内容,综合第一步可得到完整公式为:IF(COUNTIF([SEARCH('0',输入内容),SEARCH('1',输入内容),SEARCH('2',输入内容),SEARCH('3',输入内容),SEARCH('4',输入内容),SEARCH('5',输入内容),SEARCH('6',输入内容),SEARCH('7',输入内容),SEARCH('8',输入内容),SEARCH('9',输入内容)],'0')==0,LEFT(输入内容,MIN(SEARCH('0',输入内容),SEARCH('1',输入内容),SEARCH('2',输入内容),SEARCH('3',输入内容),SEARCH('4',输入内容),SEARCH('5',输入内容),SEARCH('6',输入内容),SEARCH('7',输入内容),SEARCH('8',输入内容),SEARCH('9',输入内容))-1),LEFT(输入内容,SMALL(UNION([SEARCH('0',输入内容),SEARCH('1',输入内容),SEARCH('2',输入内容),SEARCH('3',输入内容),SEARCH('4',输入内容),SEARCH('5',输入内容),SEARCH('6',输入内容),SEARCH('7',输入内容),SEARCH('8',输入内容),SEARCH('9',输入内容)]),2)-1))
3、获取数字部分内容
单行文本总长度-文本部分长度==数字部分长度,用RIGHT(单行文本,数字部分长度)获取数字内容,综合第二步可得到完整公式为:RIGHT(输入内容,LEN(输入内容)-LEN(取文本))
Tips:
1、由于这个思路是基于获取第一位数字所在位置从而截取文本部分和数字部分,因此文本部分需要是纯文本,不能包含数字,如:输入内容为XS-S110机车001,就无法用该公式分割成:XS-S110机车和001.
2、于基础公式如果有疑问,可以参考帮助文档基础公式介绍:https://hc.jiandaoyun.com/doc/9031 编辑于 2021-7-28 09:35
|