SpreadJS V19.2 新特性揭秘:公式的全角兼容

0 阅读6分钟

写公式的人多半经历过这样一下:输入法还停在中文状态,一串字符敲出去,等回车才发现括号是中文的、逗号是全角的,公式报错,光标又得退回那几处逐字改正。这在中文、日文的工作环境里几乎每天发生。输入法的中文态与西文态一旦没有及时切换,等号、括号、逗号、引号就都成了全角字形,而公式语法只认半角的那一套。

桌面 Excel 对付这种情况已经习惯成自然——输入完成时把全角符号悄悄纠正成半角,用户几乎察觉不到。SpreadJS 过去没有这一步,中文态里输入公式便容易反复出错,与用户长期养成的输入习惯对不上。V19.2 补上了这套规范化处理,让公式输入对全角符号宽容起来。

在输入的这一头

规范化发生在用户输入公式的那一头。直接在工作表单元格里录入公式,是全角转半角的主战场;从别处复制粘贴进来的公式,同样会被处理,避免"复制过来一执行就报错"。几个常见的深一点入口也一并覆盖:设计器里给单元格添加条件格式、添加数据验证时填写公式的地方,以及框选引用区域的场景。换句话说,只要是用户通过界面把公式交给产品,录入路径就统一做了这道清洗,而不是只在某个入口修修补补。

这类错误还有一处不起眼的来路:内容从网页、邮件或聊天窗口粘贴进来时,对方排版常常把引号替换成弯引号、把逗号替换成中文标点,公式一到手就带着几处走样,一执行便报错。过去使用者只能回头把这几处字符逐个挑出来重打;如今粘贴入口与录入入口走同一条规范化路径,问题在进入时就消解了,不必等报错再去排查。

被转换的内容覆盖得相当整。最外围的等号、括号与逗号、分号;引用单元格时的冒号、美元符号、表名后的感叹号;运算符里的加号、减号、乘号、除号、乘方与百分号;还有文本拼接用的连接符、条件里的比较号、花括号数组常量的括号、R1C1 引用方式里的方括号。中文输入法偏爱的那几个全角标点——书名号式的书名号、实心的句点、花引号——也都能正确对应到它们该有的半角字符上。转换针对的是"走样了的那几处",而不是整句重写:同一个公式里往往前半段正常、后半段因输入法没切换而全角,处理时也只扶正那几处,其余字符原样不动。

image.png

符号是符号,内容是内容

转换规则里有一条很重要的分寸:符号可以被纠正,字符串里的内容却要原样保留。公式里双引号括起来的是一段文本,比如一段带括号的中文说明,那么括号是文本的一部分,转换后仍是它本来的样子——规范化的对象是公式的"骨架",不是文本的"血肉"。用户写下的表名、区域名里若有意用了全角,也不受这套规则影响。

要把这条分寸做对,处理时得先把公式按语法读开,分清哪一处是结构符号、哪一处是引号内的文本,再只对结构符号动手。若不加区分地整串替换,文本里那个中文括号被一并改成半角,公式就可能变了样、甚至改了意思。正是因为有这一步按语法边界的切分,字符串内的全角与使用者有意取用的名称,才得以原样保留。

函数名同样会被理顺。内置函数若是写成全角的字母,会被转换回标准的半角写法,方便中文输入法下直接敲函数而不必特意切换;注册在全局的自定义函数名按同一条路处理。但那些本身就取成中文或全角名字的自定义函数,则保留原名不作改动——规范化不会自作主张地改写一个用户有意定义的名称。

判断的边界落在产品自己的行为上,也说得清楚:这段处理只在用户经由界面输入公式时生效。从文件读入的公式保持原样,程序接口写入的公式也保持原样——对后者而言,接口拿到什么就是什么,不会因为内部做过一次转换而改变写入方的本意。规则固定,可预期。

改了写法,不动结果

使用者或许会担心:输入被改了写法,算出来的结果会不会受影响?不会。规范化只调整字符形式,让公式从"不能被语法认识"变成"能被正常解析",最终参与计算的值与原本想表达的意思完全一致。一套全角括号的求和,与一套半角括号的求和,算出的是同一个数。功能要解决的是输入层的摩擦,不掺和到计算层里去。

落进文件的也是同一套形态:经界面录入的公式,存进单元格的是规范化之后的写法——语法认得它,重算、另存、再打开,走的都是同一条规整的公式。使用者感受到的是输入被"宽容"地接住,后端拿到的却始终是一份标准写法,不会因为某人某次没切输入法,而在文件里留下一段只有当时人能看懂的公式。

这也意味着,全角公式带来的好处是"隐性"的——用户没有感知时它最成功。真正的体感变化在于:录入不再因为一时没切换输入法而被打断,粘贴来的公式不再一执行就报错,中文与日文环境下工作流里的那一下停顿,从此少了一些。一段本来就没问题的半角公式,也不用担心被多此一举地改动——规范化只对"需要改正的字形"下手,本来就规整的公式,处理之后原样不变。这项能力是纯加法:帮到的是出过岔子的那些输入,伤不到好好的公式。对于要在多种语言环境间流转的同一份模板,这一点也省心——录入端的写法被统一之后,公式不会因为出自不同输入习惯的人之手,而留下形态各异的"方言",一份模板换人编辑、跨国协作,都无需为符号的写法额外兜底。

一句收尾的话

公式语法诞生于西文字符集,而它的使用者在全球各地用各自的输入法敲击。让语法去迁就使用者的书写习惯,哪怕只是把几个符号悄悄扶正,也是本地化里细水长流的一环。SpreadJS 这版做的不多不少,恰好是这"顺手的一环"。