【问题标题】:jruby trim string based on length with ellipsesjruby 基于椭圆的长度修剪字符串
【发布时间】:2009-10-20 01:38:59
【问题描述】:

这是一个非常具体的问题,但我想知道是否有人会有出色的解决方案。我正在尝试将具有固定字体大小的字符串放入任意大小的框中,这样,如果整个字符串不适合,我想修剪它并添加一个省略号(...)。

因此,如果我的文本是“荷兰”,我想确定它的哪一部分适合我的任意大小的盒子,看起来像“荷兰...”

我正在使用 jruby,所以 java 或 ruby​​ 都可以。除了逐个字符地修剪/测试字符串是否适合之外,我想不出一个绝妙的解决方案。由于它不是固定宽度的字体,所以我不能将每个字符都视为相同的宽度,这样会更容易。

有什么想法或提示可以为我指明正确的方向吗?

【问题讨论】:

  • 你使用的是什么 GUI 框架?
  • 字符串的输出是什么?这有点大不同。
  • 这是一个 Rails 应用程序,它是一个生成为地图上位置标签的图像。图像是一个代表位置大小的圆圈,边界框是我试图将字符串放入其中。

标签: java ruby string jruby


【解决方案1】:

逐个字符的循环可能没问题。但是,如果您正在处理数十亿个并且需要加快它们的速度,您可以对正确的长度进行二进制搜索,而不是仅仅遍历字符。这是一个可以在 Integer 上调用的通用 binary_search 方法。给它一个返回 -x 0 或 +x 的 比较块,它每次迭代跳跃一半,直到测试返回 0 或跳跃大小变得太小。

class Integer
  def binary_search
    current = self
    nextjump = current / 2.0
    until (test = yield(current)) == 0 || nextjump < 0.5
      if test < 0
    current += nextjump
      else
        current -= nextjump
      end
      nextjump /= 2.0
    end
    current
  end
end

然后像这样使用它:

goal = whatever
a[0...(a.size.binary_search {|i| a[0...i].stringWidth - goal})]

【讨论】:

  • 这是个好主意,我认为现在我坚持使用逐个字符,因为我没有做数十亿,但如果我碰巧注意到任何问题,我会加快速度性能命中。谢谢!
【解决方案2】:

另一种方法是在 CSS 中处理显示的截断!

<div style="border: 1px solid gray; width: 200px;">
<span style="float: right; color: gray">...</span>
<div style="width: 184px; overflow: hidden; white-space: nowrap">
This is a really long string that goes on and on and on and we need to do something about it eventually but for now it just isn't important so I don't want to think about it.
</div></div>

这使您不必担心用户浏览器的字体指标(您不知道,而且您的 Java 服务器的字体指标与这些指标之间存在未知关系)这一吃力不讨好的任务。

【讨论】:

  • 这是一个公平的建议,但我正在生成一个放置在地图上的图像,所以这是一个动态的东西,我需要将文本放在图像中,因为服务器只返回一个图像基于链接参数。
【解决方案3】:

看看 java 的 FontMetrics 类,尤其是 stringWidth 方法。

【讨论】:

  • 我已经在使用它来确定字符串是否适合框内,但是如果字符串不适合,这并不能真正帮助我在算法上将字符串修剪为字符的子集.目前我正在逐个字符循环并测试stringWidth。好像工作太多了
  • 好吧,你可以平分而不是逐个字符地循环,但实际上,听起来你必须做一些这样的事情才能正确截断。如果您想要一个良好的起始估计,请将所有内容视为固定宽度(通过 getMaxAdvance),然后看看它会带给您什么。或使用 getWidths 并在纯代码中自己进行计算,无需进一步参考字体。
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多