鸿运应用开发学习-发现了一个TextInput组件中使用正则表达式后出现的BUG

发布时间:2024年01月13日

一、起因

最近我正在学习鸿蒙应用开发,准备把之前在安卓系统上开发的一个小应用,使用ArkTs语言,再写一遍,做成原生鸿蒙应用。我的应用需要对液体的体积数据进行换算,对输入的体积和对应的温度参数根据相关的计算公式进行换算,得到该液体在20℃下的标准体积,然后在用标准体积做后续的数据处理。该应用需要用户输入体积和温度,这就要求用户只能输入0-9的数字以及符号和小数点,且要符合数字的要求。

二、发现InputType.Number模式不支持小数点

之前我在安卓系统上进行应用开发时,输入组件EditText可以通过设置inputType="numberSigned|numberDecimal"达到目的。但在鸿蒙应用的开发过程中,发现鸿蒙的输入组件TextInput其属下type只提供了Normal、Password、Email、Number、PhoneNumber五个枚举值,没有与安卓的numberSigned、numberDecimal功能相对应的枚举值。我使用InputType.Number进行测试,确认只能输入0-9的数字,无法输入其它符号。

三、反馈问题后华为工程师建议使用正则表达式

?于是我于1月5日在华为开发者联盟上向客户提交了问题,希望华为官方人员能提供帮助。

隔了几个小时,华为官方工程师给予了答复,确认鸿蒙的InputType不支持可以输入数字及负号和小数点的方式。建议我使用正则表达式来解决问题。?

四、使用正则表达式也不能解决问题

于是我又恶补了一下正则表达式的知识,按照所学的知识对输入组件TextInput做了过滤,并且type属性要选择InputType.Normal。

.inputFilter('(^[-]?[0-9]{1,2}[.]{1}[0-9]{0,1}$)|(^[-]?[0-9]{1,2}$)', (e) => { // 排除字母汉字和部分标点符号还有负号
    console.log('不合法字符:' + JSON.stringify(e))
  })

再次进行测试结果发现,仍然不能输入负号和小数点。

我怕自己设置的正则表达式有问题,有在python上进行了测试,确认表达式没错。

之后,我尝试了简化正则表达式做进一步的检测,结果还是不能符合要求,比如使用

'^(-?[0-9.]+)$'的正则表达式,可以输入小数点了,但不能输入负号,而且还存在输入的数据不符合数字要求的情况。

五、可能是鸿蒙系统的一个小BUG

我再次将问题提交给华为,这次连客户工程师也没辙了,回复我说,“已经将问题上升至相关部门,会尽快给您答复,请耐心等待。”

今天已经1月11日了,距离我第二次提问已经过去了7天,到写这个博客时,我还没有得到答复,估计这可能真是一个BUG,华为的工程师正在研究中吧。

六、当前暂时的解决办法

但我的应用还是要继续开发,我尝试着将正则表达式改成'[-1234567890.]' 后再次测试,可以输入数字、符合和小数点,但是.... 输入的字符顺序得不到限制,可能出现非数字形式的字符串,比如 -5-5-? 12..5? .-512. 什么的。总之,仍然与我的需求有距离,还需要写大量的代码对输入的字符串进行判定,比较麻烦。并且由于type属性是选择的InputType.Normal,那么点击TextInput组件后,弹出的软键盘就不是数字键盘了,还得切换一下。这点上安卓还是方便得多,只需要一行代码就可以搞定。希望华为的工程师能解决这个问题。这对需要输入带符号和小数点数字的情况会很有帮助。

文章来源:https://blog.csdn.net/bahamutj/article/details/135533763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。