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). NSMeas
For anyone coming here in future. You will get correct string if you don't change NSLocale
in code. If you need to change it do it in System Settings. stringFromKilograms
is the key method which provides metric depended string. Also it is possible to configure NSNumberFormatter
to print out rounded values by setting maximumFractionDigits
to 0.
Once you do this you don't need to check for metric system with [[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];
Prints correctly:
(lldb) po weightString3
138lb
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