Source/Charts/Formatters/DefaultValueFormatter.swift (81 lines of code) (raw):
//
// DefaultValueFormatter.swift
// Charts
//
// Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda
// A port of MPAndroidChart for iOS
// Licensed under Apache License 2.0
//
// https://github.com/danielgindi/Charts
//
import Foundation
/// The default value formatter used for all chart components that needs a default
@objc(ChartDefaultValueFormatter)
open class DefaultValueFormatter: NSObject, ValueFormatter
{
public typealias Block = (
_ value: Double,
_ entry: ChartDataEntry,
_ dataSetIndex: Int,
_ viewPortHandler: ViewPortHandler?) -> String
@objc open var block: Block?
@objc open var hasAutoDecimals: Bool
@objc open var formatter: NumberFormatter?
{
willSet
{
hasAutoDecimals = false
}
}
open var decimals: Int?
{
didSet
{
setupDecimals(decimals: decimals)
}
}
private func setupDecimals(decimals: Int?)
{
if let digits = decimals
{
formatter?.minimumFractionDigits = digits
formatter?.maximumFractionDigits = digits
formatter?.usesGroupingSeparator = true
}
}
public override init()
{
formatter = NumberFormatter()
formatter?.usesGroupingSeparator = true
decimals = 1
hasAutoDecimals = true
super.init()
setupDecimals(decimals: decimals)
}
@objc public init(formatter: NumberFormatter)
{
self.formatter = formatter
hasAutoDecimals = false
super.init()
}
@objc public init(decimals: Int)
{
formatter = NumberFormatter()
formatter?.usesGroupingSeparator = true
self.decimals = decimals
hasAutoDecimals = true
super.init()
setupDecimals(decimals: decimals)
}
@objc public init(block: @escaping Block)
{
self.block = block
hasAutoDecimals = false
super.init()
}
/// This function is deprecated - Use `init(block:)` instead.
// DEC 11, 2017
@available(*, deprecated, message: "Use `init(block:)` instead.")
@objc public static func with(block: @escaping Block) -> DefaultValueFormatter
{
return DefaultValueFormatter(block: block)
}
open func stringForValue(_ value: Double,
entry: ChartDataEntry,
dataSetIndex: Int,
viewPortHandler: ViewPortHandler?) -> String
{
if let block = block {
return block(value, entry, dataSetIndex, viewPortHandler)
} else {
return formatter?.string(from: NSNumber(floatLiteral: value)) ?? ""
}
}
}