截斷過長字串為省略號演算法
為避免浪費各位看官的時間,我們還是直接轉入正題吧。在實際的開發當中,我們經常會遇到要字串比顯示的區域要長的情況,從而導致顯示不全。最合適的方法自然是跑馬燈的滾動顯示,不過這個可能稍微複雜了點,並不是所有的情況下都能適用;也許最最簡易的,可能就是直接將超出範圍的字串用省略號替代了。
好像不是很難,不是麼?但實際並非如此。比如,有乙個字串"你好,我們可以聊聊麼?",你是決定只顯示哪部分,而哪部分是被替代的呢?這個字串所要顯示的文字,如何確定?大部分菜鳥的第一反應,估計就是固定要只是顯示多少個字元,超過的,就一律以省略號替代。實際上,這是不行的。如果字元全部為中文,或是全部為英文還行,如果又有中文和英文,那麼由於互相字元寬度不同,顯示就很死翹翹了。
假設我預設的顯示文字為九個,那麼在我的平台上顯示的就是這樣:
很明顯看到,這兩串字元的寬度完全是不同的,而下面的英文本元其實可以容納更多。所以,以固定數目來做擷取的標準,是完全不可取的。
有的朋友或許對gettextmetrics比較熟悉,想到呼叫該函式返回字型的平均寬度,然後再與範圍寬度相除。但畢竟平均不是實際,有時候用平均值來計算,誤差也是很大的。
不過,微軟畢竟還是微軟,並沒有將路給堵絕。它還給我們留了乙個gettextextentpoint函式,用它來獲取字串所佔的空間範圍。
在具體說這個函式之前,我們先來看一副圖:
這是字串超出顯示範圍的乙個情況。其中,藍色方框的區域是顯示的區域,綠色方框是應該顯示的字元,而紅色則是省略號佔據的空間。對於我們來說,只需要知道綠色方框能包含多少個字元即可。
而gettextextentpoint函式能夠計算輸入的字串佔據的空間範圍,所以通過它進行運算,就能獲知我們需要顯示多少個字元。現在的問題是,我們如何去呼叫這個函式?難道先從"你"開始,依次遞進,以"你"、"你好"、"你好,"、"你好,這"等等這樣的方式乙個乙個作為形參去進行測試?不用想,這效率,肯定奇差,甚至可能成為拖慢程式的乙個禁錮。
所以,簡單點,我們就用二分法吧。宣告乙個函式,它可以接收當前的hdc,顯示範圍的大小,以及測試的字串,返回的是該顯示範圍能容納下的字元。
故此,函式實現如下:
那麼,看看我們這函式的實際顯示成果吧:
用CSS來實現把過長的字串替換為省略號
一 html如下 很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長 很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長 注1 td nowrap nowrap 讓禁止文字換行。二 css如下 注2 table layout fixed,固定不會被裡面的內容撐大 注3 o...
帶省略號的PHP字串擷取函式
function pa stringdeflate strinfo,nlenset if m icode 160 else if m nlen nlenset else if m bdeflated else return m strresult 測試部分 開始 strcrlf r n strinf...
js 字串超長用省略號處理(中英文一起處理)
首先先說乙個方法,就是有中文的時候,計算真實的長度 function getreallen str 原理是利用正則把中文變成 aa 兩個字串,然後計算長度 然後接下來是重點 用途 js中字串超長作固定長度加省略號 處理 引數說明 str 需要進行處理的字串,可含漢字 len 需要顯示多少個漢字,兩個...