8

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?

George Filippakos
  • 16,359
  • 15
  • 81
  • 92

4 Answers4

16

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)
Bhadresh Kathiriya
  • 3,147
  • 2
  • 21
  • 41
George Filippakos
  • 16,359
  • 15
  • 81
  • 92
7
   lineChartDataSet.valueFormatter = DefaultValueFormatter(decimals: 2)
Jiebe
  • 337
  • 1
  • 4
  • 10
6

This worked for me:

Swift 5

let valFormatter = NumberFormatter()
valFormatter.numberStyle = .currency
valFormatter.maximumFractionDigits = 2
valFormatter.currencySymbol = "$"

lineChartPrice.leftAxis.valueFormatter = DefaultAxisValueFormatter(formatter: valFormatter)
Arash HF
  • 837
  • 12
  • 10
3
 let data = PieChartData(dataSet: set) 

 let formatter = NumberFormatter() 
 formatter.numberStyle = .percent 
 formatter.maximumFractionDigits = 2 
 formatter.multiplier = 1.0 
 formatter.percentSymbol = "%" 
 formatter.zeroSymbol = "" 
 data.setValueFormatter(DefaultValueFormatter(formatter: formatter))
rjgodoy
  • 101
  • 4
  • 11