【问题标题】:String.format alternative on CodenameOneCodenameOne 上的 String.format 替代方案
【发布时间】:2019-04-22 17:36:21
【问题描述】:

我正在尝试将基于 Java 的库移植到 CodenameOne,以便在跨平台项目中使用它,但它使用了很多我在 CodenameOne 中找不到的 Java 标准 API,首先是 String.format

我已阅读this Q&A 并且我了解有一些实用程序库可以实现基类中缺少的内容。 是否有实现String.format 的库类?

例如,我需要做类似String.format("%02d:%02d:%02d", hh, mm, ss);的事情

【问题讨论】:

  • 看来没有别的办法了,看看这个链接stackoverflow.com/questions/36681724/…
  • 我正在阅读相同的页面。我理解 Shai 关于多平台支持的说法,但以这种方式格式化字符串是真正主流的东西,我认为它不依赖于架构

标签: java cross-platform codenameone


【解决方案1】:

您可以使用com.codename1.l10n.SimpleDateFormat 来格式化时间,尽管我个人只是使​​用实用Java 代码来格式化,因为它更简单。使用Date,我们会遇到复杂的时区问题,这让人头疼。

我只是经常这样做:

public static String twoDigits(int v) {
    return v < 10 ? "0" + v : "" + v;
}

然后:

String t = twoDigits(hh) + ":" + twoDigits(mm) + ":" + twoDigits(ss);

请注意,此代码比Format 代码更有效。 Format 调用需要解析格式然后生成结果字符串,这是一个代价高昂的步骤。不过,在大多数情况下可能不会引起注意。

String.format() 的主要问题是它存在于String。由于 String 是实现的核心部分,因此无论需要如何,这样的复杂方法都会为每个应用程序增加权重。同样实现具有如此多细微差别的方法意味着在模拟器上的工作方式与在设备上的工作方式不同。因此,我们极不可能添加该方法。

事实上,在 JavaSE 上,该方法实际上只是 MessageFormat 的一种形式,我们可以将其添加到 codename1 l10n 包中。不兼容不是问题,大小/复杂性也不是问题。这是您可以自己实现的东西,如果您愿意,甚至可以作为拉取请求提交。您可以基于 Apache 许可的 Harmony 项目源来实现您的实现,或者您可以构建一个洁净室实现(我经常发现这更容易)。

【讨论】:

  • 感谢您的回答。这对我来说还不够,因为在我需要移植的库中这种方法出现了很多次(我指出的只是一千个例子之一)。我只是不想用专门为这种场合量身定制的不同方法替换它们中的每一个(这次是 SimpleDateFormat,另一次是别的),而 Java 为所有事情提供了一个单一的方法。
  • 另外,假设我有类似String.format("2 digits something %2.2d", n) 的东西,如果不使用String.format,我怎样才能实现%2.2.d 的东西?
  • L10NManager中有数字计数格式方法。请参阅我修改后的答案,涵盖 String.format 中的问题并讨论更接近您正在寻找的替代方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 2015-06-13
  • 1970-01-01
  • 2018-08-07
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多