【问题标题】:Swift NumberFormatter formatting all values to 3 decimal places?Swift NumberFormatter 将所有值格式化为小数点后 3 位?
【发布时间】:2018-07-01 03:39:57
【问题描述】:



我有大量的双精度数,它们的小数位数不同,例如:

[11307.3, 1025.64, 1.27826, 1676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]

我正在尝试格式化数字,因此每千位有逗号,并且小数位未格式化为特定数字,例如 3dp。数组应该看起来像

[11,307.3, 1,025.64, 1.27826, 1,676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]


我已经尝试通过这样定义 NumberFormatter 来做到这一点:

let numberFormatter = NumberFormatter()

然后为样式选择小数:

numberFormatter.numberStyle = NumberFormatter.Style.decimal

数组中的值显示在表格视图中,当用户点击例如第二个单元格时,在新屏幕中将显示值 1,025.64。 我用这段代码来做到这一点:

var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))
self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(formattedPrice!)"


这适用于任何不超过 3 位小数的值。 如果用户选择数组中的第三个值,它将显示 1.278 而不是 1.27826。

有没有办法用逗号格式化这些值,但不强制它们到特定的小数位数?

【问题讨论】:

  • NumberFormatter 是高度可定制的。您是否阅读了文档和Programming Guide

标签: ios arrays swift number-formatting


【解决方案1】:

链接:https://stackoverflow.com/a/27571946/6655075 .

这解决了我的问题。由于我显示了 3 个值,每个值都来自不同的数组,因此我最终会格式化所有 3 个值,而我只想格式化 1 个数组。

   extension Double {
        static let twoFractionDigits: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.minimumFractionDigits = 2
            formatter.maximumFractionDigits = 2
            return formatter
        }()
        var formatted: String {
            return Double.twoFractionDigits.string(for: self) ?? ""
        }
    }

我删除了

var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))    


并且简单地使用了

self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(coinPriceDouble!.formatted)"



编辑:正如 Dávid Pásztor 所提到的,我只想将逗号分隔符添加到需要它的值中,同时仍将每个值的精度保持到最后一个十进制值。

【讨论】:

    【解决方案2】:

    正如 vadian 所说,NumberFormatter 是高度可定制的。

    随便玩弄它的属性,比如(你需要根据自己的需要自定义):

    let numberFormatter = NumberFormatter()
    numberFormatter.numberStyle = .decimal
    numberFormatter.maximumFractionDigits = 3
    

    这里是NumberFormatter's maximumFractionDigits property and related的解释。

    这里是一个解释 NumberFormatter A Guide to NSNumberFormatter 的所有相关方面的博客。

    编辑

    将以下代码放入 Playground 并观察结果:

    let numberFormatter = NumberFormatter()
    numberFormatter.numberStyle = .decimal
    numberFormatter.maximumFractionDigits = 3
    
    let formattedNumbers = [11307.3, 1025.64, 1.27826, 1676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604].flatMap { number in
        return numberFormatter.string(from: number)
    }
    print(formattedNumbers)
    

    【讨论】:

    • 也许我误解了这个问题,但在我看来,OP 实际上想要更改 numberFormatter.maximumFractionDigits 的默认值,实际上是 3(如果您测试代码而不将其设置为 3,则得到完全相同的结果)。根据我的理解,OP实际上想要保持值的精度,并且只想将小数分隔符添加到值中,但保持小数部分不变。
    • @DávidPásztor 实际上我的只是一个例子。他/她可以使用我提供的代码来找到正确的结果
    • 正确@DávidPásztor。经过更多搜索,我遇到了stackoverflow.com/a/27571946/6655075,它解决了我的问题,因为在 segue 之后,我显示了 3 个数组中的值,因此通过执行上述操作,它格式化了所有 3 个,而不仅仅是我需要的 1 个。
    • @Jeremy 如果您仔细阅读我的答案,我提供的不是正确答案,而是一种根据您的需要找出答案的方法。更重要的是了解正在发生的事情,而不是从 SO 解决方案中复制和粘贴。游乐场有这个目的。
    【解决方案3】:

    您可以尝试将最大小数位数设置为较大的数字。

    numberFormatter.maximumFractionDigits = 15

    【讨论】:

    • 为什么是15? OP想要三个小数位
    • 有点极端的建议,它涵盖了OP关于......好吧...... 5次的要求。
    • @LorenzoB 这是最大位数,而不是确切数字。将此属性设置为较大的数字将确保格式化程序仍使用尽可能少的小数位,但不会超过 15。该属性的默认值为 3。
    • 非常混乱的答案。为什么实际上是 15?当我想要 3 位小数时,16 也可以吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2011-09-08
    • 2010-10-25
    • 2020-07-21
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多