Форматировать длинные номера для основной метки оси

Я пытаюсь отформатировать длинные числа в форме «k» для моих меток оси. Например; если у меня есть 10000 , я бы хотел, чтобы он отображался как 10k .

Я уже пытался следовать этому ответу. Но мне не удалось получить форматированные числа. Что мне нужно сделать дополнительно? Пожалуйста, направляйте меня. Благодарю.

РЕДАКТИРОВАТЬ:

HumanReadableFormatter.h

@interface HumanReadableFormatter : NSNumberFormatter @end 

HumanReadableFormatter.m

Я изменил код из приведенной выше ссылки, чтобы соответствовать моим требованиям.

 #import "HumanReadableFormatter.h" @implementation HumanReadableFormatter static const char sUnits[] = { '\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' }; static int sMaxUnits = sizeof sUnits - 1; -(NSString *) stringForObjectValue:(id)obj { int multiplier = 1000; int exponent = 0; double bytes = [(NSNumber *)obj doubleValue]; while ((bytes >= multiplier) && (exponent < sMaxUnits)) { bytes /= multiplier; exponent++; } return [NSString stringWithFormat:@"%@ %c", [super stringFromNumber: [NSNumber numberWithDouble: bytes]], sUnits[exponent]]; } @end 

Графический код:

 if(!rightY) rightY = [[CPTXYAxis alloc]init]; rightY.labelingPolicy = CPTAxisLabelingPolicyAutomatic; rightY.orthogonalCoordinateDecimal = CPTDecimalFromFloat(totIntervalShown); rightY.axisConstraints = [CPTConstraints constraintWithUpperOffset:-40]; rightY.coordinate = CPTCoordinateY; rightY.majorTickLength = 0; rightY.minorTickLength = 0; rightY.tickDirection = CPTSignNone; rightY.plotSpace = barPlotSpace; NSNumberFormatter *numFormatter; if(lowerLock < 1000) //if value is < 1000, normally format it { numFormatter = [[NSNumberFormatter alloc] init]; [numFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; numFormatter.maximumFractionDigits = 2; numFormatter.minimumFractionDigits = 2; } else //for > 1000, format in human readable form { numFormatter = [[HumanReadableFormatter alloc] init]; //what i need to do here more? } rightY.labelFormatter = numFormatter; //formatted as shown on right side on graph 

введите описание изображения здесь

Вложенная петля:

введите описание изображения здесь

  • Преобразование длинного NSString в NSNumber
  • Множитель NSNumberFormatter округляется вниз, а не показывает долю
  • Ошибка с NSNumberFormatter currencySymbol
  • NSNumberFormatter только форматы до 14 значащих цифр
  • Предотвращение десятичных знаков с помощью NSNumberFormatter
  • Как добавить запятую и десятичные знаки в мой UITextField динамически?
  • iOS набор автоформатов местный номер для номера в США
  • NSNumberFormatter.string (from:) максимально возможное превышенное значение не приводит к переполнению - Swift
  • 2 Solutions collect form web for “Форматировать длинные номера для основной метки оси”

    Я отправляю решение, если кому-то это понадобится в будущем. Спасибо @ Eric за то, что помогли мне.

    HumanReadableFormatter.h

     @interface HumanReadableFormatter : NSNumberFormatter { NSNumberFormatter *numberFormatter; } @end 

    HumanReadableFormatter.m

     @implementation HumanReadableFormatter static const char sUnits[] = { '\0', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' }; static int sMaxUnits = sizeof sUnits - 1; -(id)init { if(self = [super init]) { numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; numberFormatter.maximumFractionDigits = 1; numberFormatter.minimumFractionDigits = 1; } return self; } -(NSString *) stringForObjectValue:(id)obj { int multiplier = 1000; int exponent = 0; double bytes = [(NSNumber *)obj doubleValue]; while ((bytes >= multiplier) && (exponent < sMaxUnits)) { bytes /= multiplier; exponent++; } NSString *convertedStr = [NSString stringWithFormat:@"%@ %c", [numberFormatter stringFromNumber: [NSNumber numberWithDouble: bytes]], sUnits[exponent]]; return convertedStr; } @end 

    Для использования в графике вам понадобятся две строки кода:

     HumanReadableFormatter *formatter = [[HumanReadableFormatter alloc] init]; YAxis.labelFormatter = formatter; 

    Поскольку labelFormatter использует NSFormatter , ваш пользовательский форматировщик должен переопределять -stringForObjectValue: не -stringFromNumber: который специфичен для NSNumberFormatter . NSNumber аргумент NSNumber и вы можете использовать тот же код для тела метода.

    Interesting Posts

    Неизвестный класс ViewController в файле Interface Builder

    Утверждение не выполнено: (результат == KERN_SUCCESS), функция +

    Как построить HealthKit HKUnit для ммоль / л (миллимолей на литр) для значений глюкозы в крови?

    Работа с различными разрешениями устройств iOS в SpriteKit

    Как определить, является ли видео ландшафтом / портретом, когда вы выбрали PHASset?

    Firebase iOS Не удалось получить токен по умолчанию Ошибка домена = com.firebase.iid Код = 6 "(null)"

    Как установить UIImageView с закругленными углами для режима соответствия аспект

    Разрешить использование одного распознавателя жестов и двойного нажатия в UIScrollView

    Как получить модель устройства в объективе c?

    Не удается найти модуль при архивировании в Xcode, но модуль находится во время «Run»

    Нельзя индексировать значение типа с типом индекса int

    UIImagePickerController позволяет Editing = YES только для видео

    Совместное использование изображения с помощью UIActivityViewController

    Просматривая учебник приложения Apple ToDoList, нажатие на элемент не добавляет корректную галочку «завершена».

    Невозможно изменить камеруFlashMode для UIImagePickerController

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.