NSMassFormatter не может преобразовать граммы в фунты (NSUnitMass) или отобразить значение

#objective-c #macos #cocoa #nsmeasurement

#objective-c #macos #cocoa #nsmeasurement

Вопрос:

Я пытаюсь модернизировать свои вызовы API и хочу использовать NSMassFormatter . Проблема проста. Я не могу получить никаких выходных данных (нацеленных на imperial locale). NSMeasurement's описание правильное.

Как сделать так, чтобы NSMassFormatter вес автоматически отображался «123 фунта», если я указываю граммы?

 NSNumber *weightInGrams = @(62453.0);

NSMassFormatter *weightFormatter = [NSMassFormatter new];
weightFormatter.forPersonMassUse = YES;
weightFormatter.numberFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_UK"];

NSMeasurement *weightMeasurement = [[NSMeasurement alloc] initWithDoubleValue:[weightInGrams doubleValue] unit:[NSUnitMass grams]];

NSString *weightString = [weightFormatter unitStringFromValue:[weightInGrams doubleValue] unit:NSMassFormatterUnitPound];
NSLog(@"%@", weightMeasurement);
NSLog(@"%@", weightString);

2019-03-26 17:23:37.535156 0100 testasa[65239:9291466] <NSMeasurement: 0x60800002d020> value: 62453.000000 unit: g
2019-03-26 17:23:37.535169 0100 testasa[65239:9291466] 
  

Ответ №1:

Форматировщик не выполняет никаких преобразований. Он просто форматирует количество. Грамм по-прежнему является граммом на любом языке.

Однако NSMassFormatter предоставляет удобный метод, основанный на килограммах. Так, например:

 let grams = 62453.0
let measurement = Measurement(value: grams, unit: UnitMass.grams)
let kilos = measurement.converted(to: .kilograms)
let formatter = MassFormatter()
formatter.isForPersonMassUse = true
let s = formatter.string(fromKilograms: kilos.value)
print(s) // "137.685 lb” on my machine
  

Ответ №2:

Для всех, кто придет сюда в будущем. Вы получите правильную строку, если не измените NSLocale в коде. Если вам нужно это изменить, сделайте это в системных настройках. stringFromKilograms это ключевой метод, который предоставляет строку, зависящую от метрики. Также можно настроить NSNumberFormatter вывод округленных значений, установив maximumFractionDigits значение 0.

Как только вы это сделаете, вам не нужно проверять метрическую систему с [[NSLocale currentLocale] usesMetricSystem]

 NSNumber *weightInGrams = @(62403.0);
NSMassFormatter *formatter = [NSMassFormatter new];
formatter.forPersonMassUse = YES;
formatter.unitStyle = NSFormattingUnitStyleShort;
//formatter.numberFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; -> source of bug
formatter.numberFormatter.maximumFractionDigits = 0;

NSString *weightString = [formatter stringFromKilograms:[weightInGrams doubleValue]/1000]; 
  

Печатает правильно:

 (lldb) po weightString3
138lb