Elixir 人性化的线头修剪

Elixir 人性化的线头修剪,elixir,Elixir,我想用人性化的方式修剪一根绳子 foobar="John Doe - CEO @ xyz" def human_trim(input, length) do ... end 当human\u trim(foobar,10)时,输出应为John Doe人体修剪(foobar,7)应导致John。因此,按空格拆分,然后检查匹配的内容,直到达到10个字符为止。边缘大小写将是一个完全没有空格的字符串。它必须在-3处削减,并在末尾添加“…” 我能想出一个解决这个问题的方法,有一百万个if/else

我想用人性化的方式修剪一根绳子

foobar="John Doe - CEO @ xyz"

def human_trim(input, length) do
  ...
end
human\u trim(foobar,10)
时,输出应为
John Doe
<代码>人体修剪(foobar,7)应导致
John
。因此,按空格拆分,然后检查匹配的内容,直到达到10个字符为止。边缘大小写将是一个完全没有空格的字符串。它必须在-3处削减,并在末尾添加“…”

我能想出一个解决这个问题的方法,有一百万个if/else。但我很难找到一个干净的方法来递归地解决这个问题。长生不老药风格

解决这个问题最干净的方法是什么


附加问题:最干净的解决方案也是最高效的解决方案吗?

基于您对网站需要这种解决方案的评论。您最好的选择是使用CSS为您显示字符串的第一部分


p{
文本溢出:省略号;
溢出:隐藏;
宽度:100px;
空白:nowrap;
}

这是一些需要修剪的长文本

这将根据外部div的宽度限制可以看到的字符数

  • 文本溢出:省略号
    将确保在给定空间中有太多文本时显示省略号
  • 溢出:隐藏将确保不会显示宽度内无法容纳的内容
  • 宽度:100px
    只是为了本演示的目的限制了空间量
  • 空白:nowrap将确保文本未被包装

看看。

这是一个可能的解决方案。它可能需要一些润色,但应该指导您:

def human_trim(input, length) do
  input
  |> String.split
  |> fill_to(length)
end

defp fill_to(word_list, length) do
  fill_to(word_list, length, {[], 0})
end

defp fill_to([head|[]], length, {[], _}) do
  String.slice(head, 0..(length - 1)) <> "..."
end

defp fill_to([head|tail], length, {str, cur_length}) do
  new_length = cur_length + String.length(head)

  if new_length >= length do
    Enum.join(str, " ")
  else
    fill_to(tail, length, {str ++ [head], new_length})
  end
end
def human_trim(输入,长度)do
输入
|>String.split
|>填充至(长度)
结束
defp fill_to(单词列表,长度)do
填充到(单词列表,长度,{[],0})
结束
将填充定义为([head |[],length,{[],_})do
String.slice(头,0…(长度-1))“…”
结束
将填充定义为([head | tail],长度,{str,cur_length})do
新长度=当前长度+字符串长度(头)
如果新长度>=长度do
枚举连接(str,“”)
其他的
填充到(尾部,长度,{str++[head],新长度})
结束
结束

如果要在输出中显示空格,按空格分割有什么意义?@JustinWood我没有显示超过x个字符的不动产,但我希望它是人性化的。像这样的东西有什么用途?这是一个网站吗?控制台应用程序?还有别的吗?对于您试图执行的操作,可能有更好的解决方案。@JustinWood在网站上显示字符串。再加上从中学习,你的假设是错误的。对于这两种情况,不是复杂函数,而是考虑两个函数,一个是第一个名字,另一个是全名。不要把它们混在一起,因为你会有非常难看的东西。我没有足够的钱用CSS来解决这个问题。我必须在服务器上解决它。你问过最干净、最高效的解决方案。就是这样。在网站上显示这一信息的主要问题是,您无法保证发送给客户的信息量实际上适合提供的空间。例如,“l”比“m”占用更少的空间。此规则的例外情况是,如果您使用的是单间距字体。