【问题标题】:Limiting fractional digits with NSNumberFormatter SpellOutStyle使用 NSNumberFormatter SpellOutStyle 限制小数位数
【发布时间】:2016-09-03 21:42:39
【问题描述】:

我正在尝试为我的 iOS 应用程序创建有意义的可访问性标签,并遇到了我认为 NSNumberFormatter 的奇怪问题/限制。

import UIKit

let decimal = 171.8926
let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.maximumFractionDigits = 2
print(formatter.stringFromNumber(decimal)!)
// "171.89"

formatter.numberStyle = .SpellOutStyle
print(formatter.stringFromNumber(decimal)!)
// "one hundred seventy-one point eight nine two six\n"

似乎.SpellOutStyle 出于某种原因不尊重maximumFractionDigits。

是我遗漏了什么,还是我必须像动物一样自己截断它们?

let truncDecimal = Double(Int(decimal * 100)) / 100.0
print(formatter.stringFromNumber(truncDecimal)!)
// "one hundred seventy-one point eight nine\n"

我可以使用格式化程序去除数字而不是单词的数字,这似乎很疯狂。

【问题讨论】:

    标签: swift number-formatting nsnumberformatter


    【解决方案1】:

    Swift NSNumberFormatter numberStyle SpellOutStyle 为当前语言环境打印完整的数字。

    为了做你想做的事,我建议创建一个双重扩展:

    extension Double {
        func roundToPlaces(places: Int) -> Double {
            let divisor = pow(10.0, Double(places))
            return round(self * divisor) / divisor
        }
    }
    

    然后你可以这样调用你的代码:

    let decimal = 171.8976
    let formatter = NSNumberFormatter()
    formatter.numberStyle = .DecimalStyle
    formatter.maximumFractionDigits = 2
    print(formatter.stringFromNumber(decimal)!)
    // "171.89"
    
    formatter.numberStyle = .SpellOutStyle
    print(formatter.stringFromNumber(decimal.roundToPlaces(2))!)
    // "one hundred seventy-one point nine"
    

    【讨论】:

    • 谢谢。我知道乘除的概念来舍入它,但没有想过将它放在一个扩展中,这是一个优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多