【问题标题】:NSNumberFormatter : Show 'k' instead of ',000' in large numbers?NSNumberFormatter:大量显示“k”而不是“,000”?
【发布时间】:2015-10-19 20:13:59
【问题描述】:

如果可能的话,我想将我的大数字从 100,000 更改为 $100K。

这是我目前所拥有的:

let valueFormatter = NSNumberFormatter()
valueFormatter.locale = NSLocale.currentLocale()
valueFormatter.numberStyle = .CurrencyStyle
valueFormatter.maximumFractionDigits = 0

我的问题

使用 NSNumberFormatter,如何输出 $100K 而不是 $100,000?


我原来的问题:

这是我目前所拥有的:

self.lineChartView.leftAxis.valueFormatter = NSNumberFormatter()
self.lineChartView.leftAxis.valueFormatter?.locale = NSLocale.currentLocale()
self.lineChartView.leftAxis.valueFormatter?.numberStyle = .CurrencyStyle
self.lineChartView.leftAxis.valueFormatter?.maximumFractionDigits = 0

翻译为:

let valueFormatter = NSNumberFormatter()
valueFormatter.locale = NSLocale.currentLocale()
valueFormatter.numberStyle = .CurrencyStyle
valueFormatter.maximumFractionDigits = 0

我的输出如下所示:

我的问题

使用 NSNumberFormatter,如何输出 $100K 而不是 $100,000?


更新:

我想提供有关正在发生的事情的背景信息,请观看 cmets。

func setDollarsData(months: [String], range: Double) {

    var dataSets: [LineChartDataSet] = [LineChartDataSet]()

    var yVals: [ChartDataEntry] = [ChartDataEntry]()
    for var i = 0; i < months.count; i++ {
        // I'm adding my values here in value:, value takes a Double
        yVals.append(ChartDataEntry(value: county[userFavs[0]]![i], xIndex: i))
    }

    let set1: LineChartDataSet = LineChartDataSet(yVals: yVals, label: self.userFavs[0])
    set1.axisDependency = .Left
                set1.setColor(UIColor.redColor().colorWithAlphaComponent(0.5))
     set1.setCircleColor(UIColor.redColor())
     set1.lineWidth = 2.0
     set1.circleRadius = 6.0
     set1.fillAlpha = 65 / 255.0

     dataSets.append(set1)

    let data: LineChartData = LineChartData(xVals: months, dataSets: dataSets)
    data.setValueTextColor(UIColor.whiteColor())

    // this is where I set the number formatter
    self.lineChartView.gridBackgroundColor = UIColor.darkGrayColor()
    self.lineChartView.leftAxis.startAtZeroEnabled = false
    self.lineChartView.leftAxis.valueFormatter = NSNumberFormatter()
    self.lineChartView.leftAxis.valueFormatter?.locale = NSLocale.currentLocale()
    self.lineChartView.leftAxis.valueFormatter?.numberStyle = .CurrencyStyle
    self.lineChartView.leftAxis.valueFormatter?.maximumFractionDigits = 0

    // set it to the chart // END OF THE LINE
    self.lineChartView.data = data // outputs to my chart

    }

如您所见,一旦我将数字转储到 yVals 中,我就无法访问它们,因此这些扩展只有在我侵入框架时才能工作。

【问题讨论】:

  • 根据stackoverflow.com/questions/11097064/…(和链接的线程),该功能不是“内置”到 NSNumberFormatter。
  • 你能做到吗?提前致谢
  • 很久以前,但我想我使用了 Leo 的扩展程序,并且刚刚更新了 ios-charts 库代码以满足我的需要。不是最好的方法。
  • 你如何在地图中使用这个 kformatted @DanBeaulieu
  • 阅读您上面的评论。

标签: swift nsnumberformatter currency-formatting ios-charts


【解决方案1】:

编辑/更新

Swift 3 或更高版本

extension FloatingPoint {
    var kFormatted: String {
        return String(format: self >= 1000 ? "$%.0fK" : "$%.0f", (self >= 1000 ? self/1000 : self) as! CVarArg )
    }
}

你可以像这样使用它来格式化你的输出:

10.0.kFormatted     // "$10"
100.0.kFormatted    // "$100"
1000.0.kFormatted   // "$1K"
10000.0.kFormatted  // "$10K"
162000.0.kFormatted  // "$162K"
153000.0.kFormatted  // "$153K"
144000.0.kFormatted  // "$144K"
135000.0.kFormatted  // "$135K"
126000.0.kFormatted  // "$126K"

【讨论】:

  • 我将删除我多余的 cmets 并修改我的问题以删除本地化方面。感谢您的时间 Leo。
【解决方案2】:

我遇到了同样的问题,并通过实现自定义格式化程序解决了它。刚开始用 Swift 编码,所以代码可能不是最地道的。

open class KNumberFormatter : NumberFormatter {
    override open func string(for obj: Any?) -> String? {
        if let num = obj as? NSNumber {
            let suffixes = ["", "k", "M", "B"]
            var idx = 0
            var d = num.doubleValue
            while idx < 4 && abs(d) >= 1000.0 {
                d /= 1000.0
                idx += 1
            }
            var currencyCode = ""
            if self.currencySymbol != nil {
                currencyCode = self.currencySymbol!
            }

            let numStr = String(format: "%.1f", d)

            return currencyCode + numStr + suffixes[idx]
        }
        return nil
    }
}

【讨论】:

  • 这个解决方案崩溃到1万亿及以上。以这种方式转换以下行可以解决问题。而 idx = 1000.0 {
【解决方案3】:

我认为你可以为 NSNumberFormatter 添加一个扩展。尝试以下,我没有测试它,所以如果需要编辑,请在评论中告诉我

extension NSNumberFormatter {
    func dividedByK(number: Int)->String{
        if (number % 1000) == 0 {
            let numberK = Int(number / 1000)
            return "\(numberK)K"
        }
        return "\(number)"
    }
}

【讨论】:

  • 酷,这个扩展方法只需要 Int 所以如果你正在使用双打,那么你需要更改参数并进行更多编辑
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多