iosswiftios-charts

iOS Charts ValueFormatter


I am using iOS charts plugin (line chart) and wish to style the chart values (the number above each point) to a decimal number.

The value is a double, but charts by default is rounding it and displaying it as an integer.

I have tried the following but not working:

    let valueformatter = NumberFormatter()
    valueformatter.numberStyle = .decimal
    valueformatter.locale = Locale.current
    lineChartDataSet.valueFormatter = valueformatter as? IValueFormatter

I have tried various other properties but non of them change the format of the number in the dataset.

How can I change the format of the displayed number?


Solution

  • Almost there, just need to add the following class:

    //For old Charts version
    //class ChartValueFormatter: NSObject, IValueFormatter {
    
    //For Charts version 4.0.1
    class ChartValueFormatter: NSObject, ValueFormatter {
        fileprivate var numberFormatter: NumberFormatter?
    
        convenience init(numberFormatter: NumberFormatter) {
            self.init()
            self.numberFormatter = numberFormatter
        }
    
        func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String {
            guard let numberFormatter = numberFormatter
                else {
                    return ""
            }
            return numberFormatter.string(for: value)!
        }
    }
    

    Now use this as the number formatter:

    let numberFormatter = NumberFormatter()
    numberFormatter.numberStyle = .decimal
    numberFormatter.locale = Locale.current
    let valuesNumberFormatter = ChartValueFormatter(numberFormatter: numberFormatter)
    lineChartDataSet.valueFormatter = valuesNumberFormatter
    lineChartDataSet.valueFont = lineChartDataSet.valueFont.withSize(chartFontPointSize)