「有研究顯示,打字的時(shí)候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會(huì)在 34 歲的時(shí)候跟自己不愛的人結(jié)婚,而其余三成的人最后只能把遺產(chǎn)留給自己的貓。畢竟愛情跟書寫都需要適時(shí)地留白。與大家共勉之?!埂?vinta/paranoid-auto-spacing
先看完整代碼:
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
}
當(dāng)然如果強(qiáng)行再減,代碼也可以縮短成 3 行。
關(guān)于中英文之間在什么情況下加空格??梢詤⒖季蚪疬@篇文章。 :譯文排版規(guī)則指北#空格
step01: 首先把目錄文字分解成單個(gè)字符串集合:
var stringList: List<String> = this.toCharArray().map { it.toString() }
map 操作符:返回一個(gè)每一個(gè)元素根據(jù)給定的函數(shù)轉(zhuǎn)換所組成的 List。
step02: 使用 reduce 操作符將單個(gè)字符串拆分組合。
stringList.reduce { acc, s ->{ 處理 }
reduce 操作符:在從第一項(xiàng)到最后一項(xiàng)通過一個(gè)函數(shù)累計(jì)所有的元素。
step03: 判斷前后是否需要加空格
isLatin(c: Char) :判斷此字符是否為拉丁符號(字母,數(shù)字,半角符號等)
allowSpace(c: Char):是否允許有空格(中文全角符號兩邊不需要加空格)
前后字符分別為中英文,并且中文字符不能為全角符號。
代碼實(shí)現(xiàn) :
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上,數(shù)據(jù)存儲(chǔ)是圍繞AVObject進(jìn)行的。今天出去買菜花了5000元。"
text = text.addSpace()
println(text)
輸出為:
在 LeanCloud 上,數(shù)據(jù)存儲(chǔ)是圍繞 AVObject 進(jìn)行的。今天出去買菜花了 5000 元。