「有研究顯示似舵,打字的時候不喜歡在中文和英文之間加空格的人笋婿,感情路都走得很辛苦吏够,有七成的比例會在 34 歲的時候跟自己不愛的人結婚疯暑,而其余三成的人最后只能把遺產(chǎn)留給自己的貓训柴。畢竟愛情跟書寫都需要適時地留白。與大家共勉之妇拯』媚伲」—— 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
}
當然如果強行再減瞪浸,代碼也可以縮短成 3 行儒将。
關于中英文之間在什么情況下加空格《云眩可以參考掘金這篇文章钩蚊。 :譯文排版規(guī)則指北#空格
step01: 首先把目錄文字分解成單個字符串集合:
var stringList: List<String> = this.toCharArray().map { it.toString() }
map 操作符:返回一個每一個元素根據(jù)給定的函數(shù)轉換所組成的 List。
step02: 使用 reduce 操作符將單個字符串拆分組合蹈矮。
stringList.reduce { acc, s ->{ 處理 }
reduce 操作符:在從第一項到最后一項通過一個函數(shù)累計所有的元素砰逻。
step03: 判斷前后是否需要加空格
isLatin(c: Char) :判斷此字符是否為拉丁符號(字母,數(shù)字泛鸟,半角符號等)
allowSpace(c: Char):是否允許有空格(中文全角符號兩邊不需要加空格)
前后字符分別為中英文蝠咆,并且中文字符不能為全角符號。
代碼實現(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ù)存儲是圍繞AVObject進行的刚操。今天出去買菜花了5000元。"
text = text.addSpace()
println(text)
輸出為:
在 LeanCloud 上再芋,數(shù)據(jù)存儲是圍繞 AVObject 進行的菊霜。今天出去買菜花了 5000 元。