# 5 行 Kotlin 代码实现自动给中文英文之间加入合适的空格


「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟本身不爱的人结婚,而其他三成的人最后只能把遗产留给本身的猫。毕竟爱情跟书写都须要适时地留白。与你们共勉之。」—— vinta/paranoid-auto-spacinggit

先看完整代码:github

fun isLatin(c: Char) = c.toInt() < 256

fun allowSpace(c: Char) = c !in " ,。;「」:《》『』、[]()*_"

fun String.addSpace() = this.toCharArray().map { it.toString() }.reduce { acc, s ->
    if (isLatin(acc[acc.lastIndex]) != isLatin(s[0]) && allowSpace(s[0]) && allowSpace(acc[acc.lastIndex])) acc + " " + s  else acc + s
}
复制代码

固然若是强行再减,代码也能够缩短成 1 行。bash

关于中英文之间在什么状况下加空格。能够参考掘金这篇文章。 :译文排版规则指北#空格函数

step01: 首先把目录文字分解成单个字符串集合:

var stringList: List<String> = this.toCharArray().map { it.toString() }
复制代码

map 操做符:返回一个每个元素根据给定的函数转换所组成的 List。测试

step02: 使用 reduce 操做符将单个字符串拆分组合。

stringList.reduce { acc, s ->{ 处理 }
复制代码

reduce 操做符:在从第一项到最后一项经过一个函数累计全部的元素。ui

step03: 判断先后是否须要加空格

isLatin(c: Char) :判断此字符是否为拉丁符号(字母,数字,半角符号等)this

allowSpace(c: Char):是否容许有空格(中文全角符号两边不须要加空格)spa

先后字符分别为中英文,而且中文字符不能为全角符号。code

代码实现 :ci

if (isLatin(acc[acc.lastIndex]) != isLatin(s[0]) 
    && allowSpace(s[0]) && allowSpace(acc[acc.lastIndex]))
复制代码

若是知足条件则在字符之间加上空格:

return  acc + " " + s
复制代码

相反的话保持原样:

return  acc + s
复制代码

step04: 使用 && 测试样例:

var text = "在LeanCloud上,数据存储是围绕AVObject进行的。今天出去买菜花了5000元。"
text = text.addSpace()
println(text)
复制代码

输出为:

在 LeanCloud 上,数据存储是围绕 AVObject 进行的。今天出去买菜花了 5000 元。

setp05: 彩蛋,一行代码实现全部功能。

fun String.addSpace() = this.toCharArray().map { it.toString() }.reduce { acc, s -> if ((acc[acc.lastIndex].toInt() < 256 != s[0].toInt() < 256) && s[0] !in " ,。;「」:《》『』、[]()*_" && acc[acc.lastIndex] !in " ,。;「」:《》『』、[]()*_") acc + " " + s else acc + s }
复制代码

关于我:微博简书掘金Github

相关文章
相关标签/搜索