【问题标题】:Use NumberFormatter with C format (e.g. "%6.3f")将 NumberFormatter 与 C 格式一起使用(例如“%6.3f”)
【发布时间】:2019-05-27 14:45:47
【问题描述】:

是否有任何额外的函数可以将 NumberFormatter (Swift 5) 与描述 C 格式的字符串一起使用?

示例:12.3456 (Float) with "%6.3f" (C format as String) 应该变成 12.345 (also Float)

很遗憾,Apple 的 documentation 没有提供任何示例。

我知道maximumIntegerDigitsmaximumFractionDigits 并且我知道您可以将“%6.3”与NSLogString(format: .......) 一起使用,但是NumberFormatter 是否有一个函数可以将数字直接转换为浮点数或双精度数(不是字符串),使用指定的 C 格式?

【问题讨论】:

  • 你的问题的答案是否定的。
  • 为什么需要将格式说明符转换为数字格式符?为什么不能只使用 NumberFormatter 的方法来得到你想要的结果呢?
  • 可惜了,那我要自己拆String了。感谢您的快速回复!
  • 1) NumberFormatter 不接受 printf 样式的格式。 – 2) NumberFormatter 将数字转换为字符串,反之亦然,但不能将数字转换为数字。 – 3) 12.345612.345 都不能完全表示为浮点数,因此您的任务将(几乎)总是导致舍入错误。
  • @rmaddy 我的应用程序有一个表格,每个单元格中都有一个 TextField。用户可以在 TextField 中输入一个数字,然后我根据 C 格式字符串格式化该数字。我正在从服务器下载此格式信息,每个单元格的格式信息可能不同,因此我不能只预定义“maximumFractionDigits”。

标签: ios swift nsnumberformatter


【解决方案1】:

如果你需要使用printf风格的格式字符串,我不建议使用NumberFormatter。它不是为此而设计的。只需使用String(format:_:)。您似乎不愿意这样做,但不清楚原因。

所以我可能会建议:

func convert(format: String, _ value: Float) -> Float? {
    let string = String(format: format, value)
    return Float(string)
}

你说:

示例:12.3456 (Float) with "%6.3f" (C format as String) 应该变成 12.345 (also Float)

为了清楚起见,以下将产生12.346,而不是12.345printf 风格的格式字符串是四舍五入的,而不是截断的。

let value: Float = 12.3456
print(convert(format: "%6.3f", value) ?? "Unable to convert")

顺便说一句,如果你想准确表示printf-style格式所表示的值,而不是生成浮点类型,你可以生成Decimal

func convert(format: String, _ value: Double) -> Decimal? {
    let string = String(format: format, value)
    return Decimal(string: string)
}

这仅取决于您对最终结果的处理方式。我也将其更改为使用 Double,因为它很容易超过 Float 所允许的微不足道的 7 位十进制数字精度。

【讨论】:

  • Just to be clear, the following will produce 12.346 - 对不起,我必须马上打断你:无论我使用什么版本,都不能舍入结果,只能截断!在我的应用程序中,用户可以输入一个数字,我将其保存在 JSON 文件中,然后我还会在我的应用程序中显示该数字的截断版本(根据格式)。为什么我要求一个不产生字符串的解决方案:因为我知道如何使用字符串来做到这一点(例如,用“。”分割,然后切断字符串)但我想知道它是否有内置的解决方案直接格式化数字 - 之后无需解析。
  • 我也使用String(format:....) 进行了测试,看起来您必须小心:对于一位数整数,在字符串的开头添加一个空格并解析为 Double 然后生成 @ 987654337@(强制展开将使应用程序崩溃)。因此,在解析结果之前不要忘记修剪结果:例如String(format: "%5.2", 1).trimmingCharacters(in: .whitespaces).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多