5 行 Kotlin 代碼實(shí)現(xiàn)自動(dòng)給中文英文之間加入合適的空格


「有研究顯示,打字的時(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 元。


關(guān)于我:微博,簡書,掘金Github。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評論 25 709
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,913評論 2 59
  • 海倫公主閱讀 436評論 0 0
  • 其實(shí)路很遠(yuǎn),所以別害怕出發(fā) ! 最近有好多小伙伴私信問我怎么好久沒有更文啦!其實(shí),最近一直在看書,也在業(yè)余學(xué)攝影。...
    糯米紅燒肉閱讀 374評論 2 4
  • 以前我會(huì)因?yàn)橐患∈虑槎蛣e人爭的面紅耳赤的,現(xiàn)在心態(tài)好多了,因?yàn)楫?dāng)對方情緒激動(dòng)的時(shí)候,我自己可以控制自己的情緒,...
    暖兒_8833閱讀 346評論 0 1

友情鏈接更多精彩內(nèi)容