【问题标题】:Given a string in Java, just take the first X letters在Java中给定一个字符串,只需取前X个字母
【发布时间】:2011-04-22 03:35:40
【问题描述】:

有没有类似 Java 的 C# 子字符串的东西?我正在为黑莓设备创建一个移动应用程序,由于屏幕限制,我只能显示 13 个字母和三个点作为省略号。

关于如何完成此任务的任何建议?

我需要简单的 Java 而不是什么花哨的技巧,因为我怀疑移动设备是否可以访问完整的框架。至少以我一年前使用 Java ME 的经验来看。

【问题讨论】:

标签: java string


【解决方案1】:

您可以使用String.substring() 做您想做的事。

String str = "please truncate me after 13 characters!";
if (str.length() > 16)
    str = str.substring(0, 13) + "..."

【讨论】:

  • 如果 (str.length() > 13) 对吗?无论如何,如果 str.length 是 14,你不会有一个超出范围的索引吗? :P
  • @Paolo 我没有看到错误。他正在获取长度为 13 的子字符串并添加额外的 3 个字符。如果字符串长于 16 个字符,他将其设为 16 个字符长。在我看来没有问题。
【解决方案2】:
String foo = someString.substring(0, Math.min(13, someString.length()));

编辑:仅供一般参考,从 Guava 16.0 开始,您可以这样做:

String truncated = Ascii.truncate(string, 16, "...");

用省略号截断最大长度为 16 个字符。

一边

但请注意,对于可能需要考虑 i18n 的任何事物,截断字符串以按字符显示并不是一个好的系统。它有(至少)几个不同的问题:

  1. 您可能需要考虑单词边界和/或空格,以避免在尴尬的地方截断。
  2. 拆分代理项对(尽管这可以通过检查要截断的字符是否是代理项对的第一个来避免)。
  3. 拆分字符和其后的组合字符(例如,e 后跟一个组合字符,该组合字符在该 e 上加上重音符号。)
  4. 字符的外观可能会根据某些语言中跟随的字符而改变,因此仅在该字符处截断会产生一些看起来甚至不像原来的东西。

由于这些原因(以及其他原因),我的理解是,截断 UI 中显示的最佳实践实际上是在屏幕上的正确位置淡出文本的呈现,而不是截断底层字符串。

【讨论】:

  • 是的,效果很好。非常感谢! :) 得到一个 indexOutOfBounds 异常,即使我知道 Math.min 做了什么并且它应该可以工作......让我用调试器检查一下。
  • @Colin,按照这个逻辑,你不知道是否需要省略号。
  • @Justin: 是的...我只是举一个简单的例子来获取带有前 X 个字母的子字符串。你的例子当然更适用于他的具体情况。
  • @Colin,我只是太有竞争力了,抱歉。你的回答很好。
  • @Justin “我只是在竞争中”这个拥有 23.2K 代表的家伙说 :-) LOL
【解决方案3】:

每当有一些你认为很常见的操作时,Java API 要求你检查边界、捕获异常、使用Math.min() 等(即需要比你预期的更多的工作) ,检查 Apache 的commons-lang。它几乎总是以更简洁的格式出现。在这种情况下,您将使用 StringUtils#substring 为您处理错误情况。这是 javadoc 所说的:

Gets a substring from the specified String avoiding exceptions.

A negative start position can be used to start n characters from the end of the String.

A null String will return null. An empty ("") String will return "".

 StringUtils.substring(null, *)   = null
 StringUtils.substring("", *)     = ""
 StringUtils.substring("abc", 0)  = "abc"
 StringUtils.substring("abc", 2)  = "c"
 StringUtils.substring("abc", 4)  = ""
 StringUtils.substring("abc", -2) = "bc"
 StringUtils.substring("abc", -4) = "abc"

【讨论】:

  • “我需要简单的 Java,而不是一些花哨的技巧,因为我怀疑移动设备是否可以访问完整的框架......”
【解决方案4】:
String str = "This is Mobile application."
System.out.println(str.subSequence(0, 13)+"...");

【讨论】:

  • 所以这个解决方案也会为短字符串抛出一个超出范围的索引
猜你喜欢
  • 2012-07-25
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多