Конвертировать из фунтов в килограммы, возможно, используя базовые данные
В моем приложении числа отображаются в фунтах. Мне нужно добавить возможность использовать килограммы вместо. Кто-нибудь знает, как это сделать? Я использую базовые данные для хранения номеров. Я знаю, что могу сделать все вручную, используя if
Затем заявление делает преобразование, но должен быть лучший способ.
РЕДАКТИРОВАТЬ На самом деле, я думаю, что столкнулся с огромной проблемой. Это не так просто, как преобразование чисел. Поскольку я использую сборщик и хочу предложить международную имперскую поддержку, сборщик должен отображать целые, разумные числа в кг. Если я просто переведу числа в кг, я получу десятичные числа, которые люди не будут знать, как использовать. Какие-либо предложения?
4 ответа
https://github.com/davedelong/DDUnitConverter
NSNumber *weightInPounds = [NSNumber numberWithInt:42];
NSNumber *weightInKilos = [[DDUnitConverter massUnitConverter] convertNumber:weightInPounds fromUnit:DDMassUnitUSPounds toUnit:DDMassUnitKilograms];
Довольно просто
Я бы предложил использовать пользовательский NSFormatter для преобразования ваших чисел в строки для отображения. Вы всегда будете хранить свои данные в одном формате, предоставляя возможность отображать их в любом формате. Вам понадобится простая настройка (сохраненная через NSUserDefaults), чтобы указать форматеру, какой формат использовать. Некоторые преимущества этого заключаются в том, что вам нужно иметь дело только с этим при отображении чисел. Поскольку вам уже нужно преобразовать числа в строки, чтобы отобразить их, в вашем коде будет очень мало изменений. Кроме того, вам вообще не придется менять свои основные хранилища данных, поскольку настройки хранятся в настройках приложения. Вы можете даже создать подкласс NSNumberFormatter для автоматического форматирования числа после преобразования. Вот пример реализации:
- (NSString *)stringForObjectValue:(NSNumber *)number {
double val = [number doubleValue];
BOOL isKGs = [[NSUserDefaults standardUserDefaults] boolForKey:@"wantsKGs"];
if(isKGs) val *= 0.45359237;
NSString *str = [super stringForObjectValue:[NSNumber numberWithDouble:val]];
if(isKGs) return [str stringByAppendingString:@" kg"];
return [str stringByAppendingString:@" lbs"];
}
Для получения дополнительной информации о пользовательских средствах форматирования см. Создание пользовательского средства форматирования.
Это может быть хорошей идеей, чтобы кодировать его так, чтобы он всегда работал с единицами измерения и масштабированием в качестве переменных.
Единицами измерения и масштабирования будут "фунты" и 1,0, или "килограммы" и 0,45359237, или что угодно.
Есть так много способов сделать это.
Мне бы пришлось сделать некоторые предположения о вашем приложении, но если вы хотите иметь возможность изменить (глобально) с фунтов на килограммы, то, возможно, у меня будет диалог настроек в вашем приложении, чтобы пользователь мог сохранить свое решение увидеть в фунтах или килограммах, я бы сохранил это в настройках вашего приложения и использовал бы этот параметр как часть инициализации вашего приложения. тогда, где бы вы ни показывали значение в фунтах или килограммах, вам просто нужно проверить пользовательские настройки и соответственно изменить значения (и, возможно, любые метки в приложении), это будет так же просто, как проверка в коде, который извлекает значения из базовой даты
Проверьте настройки, сохраните это как глобально доступную часть состояния; это может быть участник в вашем приложении-делегат, единственный элемент, содержащий параметры, или просто запрашивающий параметр там, где вам нужно проверить его. Затем в коде, который обращается к данным lbs, проверьте настройку, если для нее задано значение kg, выполните расчет и верните его обратно из кода доступа к данным в представление.