Search code examples
objective-cmacoscocoansmeasurement

NSMassFormatter can't convert grams to lbs (NSUnitMass) or display value


I am trying to modernize my API calls and want to utilize NSMassFormatter. The problem is simple. I can't get any output (aiming for imperial locale). NSMeasurement's description is correct.

How to make NSMassFormatter to display "123 lbs" weight automatically if I provide grams?

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] 

Solution

  • The formatter does not perform any conversions. It merely formats a quantity. A gram is still a gram in any language.

    However, NSMassFormatter does provide a convenience method based on kilograms. So for example:

    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