#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