3 回答

TA貢獻1772條經驗 獲得超8個贊
切片字符串可能會出現問題,因為切片適用于字節,而不是符文。然而,范圍適用于符文:
lastSpaceIx:=-1
len:=0
for i,r:=range str {
if unicode.IsSpace(r) {
lastSpaceIx=i
}
len++
if len>=max {
if lastSpaceIx!=-1 {
return str[:lastSpaceIx]+"..."
}
// If here, string is longer than max, but has no spaces
}
}
// If here, string is shorter than max

TA貢獻1765條經驗 獲得超5個贊
范圍是完全沒有必要的;就像現在一樣,您的整個功能可能只是:
func truncateText(s string, max int) string {
return s[:max]
}
這太簡單了,它甚至不應該是一個函數;但當然它也會切斷你說你不想要的單詞。因此,您可以:
func truncateText(s string, max int) string {
if max > len(s) {
return s
}
return s[:strings.LastIndex(s[:max]," ")]
}
或者,如果您想使用多個字符作為單詞邊界而不僅僅是空格:
func truncateText(s string, max int) string {
if max > len(s) {
return s
}
return s[:strings.LastIndexAny(s[:max]," .,:;-")]
}

TA貢獻1845條經驗 獲得超8個贊
要根據空格等進行拆分,可以使用 regex :
func splitString(str string) []string {
re := regexp.MustCompile("[\\s\\n\\t\\r ]+") //split according to \s, \t, \r, \t and whitespace. Edit this regex for other 'conditions'
split := re.Split(str, -1)
return split
}
func main() {
var s = "It is a long\nestablished fact that a reader\nwill\nbe distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English."
var maxLen = 40
arr := splitString(s)
totalLen := 0
finalStr := ``
for _, each := range arr {
if (totalLen + len(each) > maxLen) {
fmt.Print(strings.TrimSpace(finalStr) + `...`)
break
}
totalLen += len(each)
finalStr += each + ` `
}
}
//老2
您可以執行以下操作:將字符串拆分為切片并循環遍歷切片,直到字符串的總長度高于最大允許長度。
var s = "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English."
var maxLen = 30
arr := strings.SplitAfter(s, ` `)
totalLen := 0
finalStr := ``
for _, each := range arr {
if (totalLen + len(each) > maxLen) {
fmt.Print(strings.TrimSpace(finalStr) + `...`)
break
}
totalLen += len(each)
finalStr += each
}
這是一個早已確立的事實……
//舊的錯誤答案
您必須使用字符串和切片:
var s = "It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English."
newS := s[:30 - 3]
newS += `...`
fmt.Print(newS)
結果 :It is a long established fa...
- 3 回答
- 0 關注
- 186 瀏覽
添加回答
舉報