Значения формата круговой диаграммы в диаграммах

Ganesh Kalal спросил: 31 июля 2018 в 09:31 в: ios

Я использую круговую диаграмму из библиотеки Charts для iOS и смог отобразить результаты на диаграмме, но я не могу отформатировать значение на этой диаграмме.

Ожидаемый результат

Я хочу, чтобы значение было добавлено до значения. Точно так же - £ 10

Что я сделал

class ChartValueFormatter : NSObject, IValueFormatter {    var numberFormatter : NumberFormatter?    convenience init(numberFormatter : NumberFormatter) {
        self.init()
        self.numberFormatter = numberFormatter
    }    func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String{
        return numberFormatter!.string(for: "£ \(value)")!
    }}let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.locale = Locale.current
let valuesFormatter = ChartValueFormatter(numberFormatter: numberFormatter)             
dataSet.valueFormatter = valuesFormatter

Актуальная проблема

Этот подход дает мне ошибку на return numberFormatter!.string(for: "£ \(value)")!, и ошибка связана с тем, что value является nil.

Может ли кто-нибудь пожалуйста, помогите мне в том, что я сделал неправильно, и что нужно сделать, чтобы получить ожидаемый результат.

2 ответа

Bliss ответил: 31 июля 2018 в 09:44

Используйте if let, чтобы остановить принудительное развертывание, которое приводит к ошибке. Если нет значения, оно не должно ничего показывать, верно? В любом случае, попробуйте этот фрагмент кода

func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String{
        if let myValue = value {
            if let string = numberFormatter!.string(for: "£ \(value)") {
                return string
            }
        }
        return "here enter text, when there is no value"
    }

Здесь я принудительно распаковываю ваш numberFormatter, потому что вы инициализировали его в convenience init

Sandy ответил: 31 июля 2018 в 09:44

Пожалуйста, отметьте это:

let price:Float = 1.99extension Float {
    var asLocaleCurrency:String {
        var formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.currencyCode = "GBP"
        return formatter.string(for: self)!
    }
}let pri = price.asLocaleCurrency
print(pri)

Результат: £ 1.99

вы должны использовать

formatter.numberStyle = .currency

, а не как .decimal

Ganesh Kalal ответил: 31 июля 2018 в 10:05
Удивительное решение, но знаете ли вы, как я могу установить это для моего dataset?
Sandy ответил: 31 июля 2018 в 10:07
в вашем случае ваше значение равно двойному, вам необходимо обновить расширение для Double. Я думаю, что решения имеет смысл?