54 BOOL _allowsNonnumericFormatting;
55 BOOL _includesActualByteCount;
59 BOOL _zeroPadsFractionDigits;
66 if (
self = [super init])
70 _allowsNonnumericFormatting = YES;
72 _includesActualByteCount = NO;
75 _zeroPadsFractionDigits = NO;
77 [_numberFormatter setNumberStyle:CPNumberFormatterDecimalStyle];
78 [_numberFormatter setMinimumFractionDigits:0];
86 + (
CPString)stringFromByteCount:(
int)byteCount countStyle:(
int)countStyle
90 [formatter setCountStyle:countStyle];
92 return [formatter stringFromByteCount:byteCount];
110 while ((bytes >= divisor) && (exponent < unitCount))
117 if (_allowedUnits === 0 || (_allowedUnits & (1 << exponent)))
119 unitIndex = exponent;
129 if (unitIndex === -1)
130 for (var i = 1; i < unitCount; ++i)
132 unitBytes /= divisor;
134 if ((_allowedUnits === 0) || (_allowedUnits & (1 << i)))
145 if (unitBytes >= 1.0)
154 else if (exponent == 2)
161 if (_zeroPadsFractionDigits)
166 if (_zeroPadsFractionDigits)
174 [_numberFormatter setMinimumFractionDigits:minDigits];
175 [_numberFormatter setMaximumFractionDigits:maxDigits];
181 if (_allowsNonnumericFormatting && bytes === 0)
182 [parts addObject:@"Zero"];
184 [parts addObject:[_numberFormatter stringFromNumber:unitBytes]];
188 [parts addObject:CPByteCountFormatterUnits[unitIndex]];
190 if ((unitIndex > 0) && _includesCount && _includesUnit && _includesActualByteCount)
192 [_numberFormatter setMaximumFractionDigits:0];
193 [parts addObject:[
CPString stringWithFormat:@"(%s bytes)", [_numberFormatter stringFromNumber:byteCount]]];
196 var result = [parts componentsJoinedByString:@" "];
199 return [result stringByReplacingOccurrencesOfString:@"bytes" withString:@"byte"];
209 if ([anObject isKindOfClass:
CPNumber])
215 - (BOOL)getObjectValue:(idRef)anObject forString:(
CPString)aString errorDescription:(CPStringRef)anError
228 - (void)setCountStyle:(
int)style
233 - (BOOL)allowsNonnumericFormatting
235 return _allowsNonnumericFormatting;
238 - (void)setAllowsNonnumericFormatting:(BOOL)shouldAllowNonnumericFormatting
240 _allowsNonnumericFormatting = shouldAllowNonnumericFormatting;
243 - (BOOL)includesActualByteCount
245 return _includesActualByteCount;
248 - (void)setIncludesActualByteCount:(BOOL)shouldIncludeActualByteCount
250 _includesActualByteCount = shouldIncludeActualByteCount;
258 - (void)setAdaptive:(BOOL)shouldBeAdaptive
260 _adaptive = shouldBeAdaptive;
265 return _allowedUnits;
268 - (void)setAllowedUnits:(
int)allowed
271 _allowedUnits = allowed;
274 - (BOOL)includesCount
276 return _includesCount;
279 - (void)setIncludesCount:(BOOL)shouldIncludeCount
281 _includesCount = shouldIncludeCount;
286 return _includesUnit;
289 - (void)setIncludesUnit:(BOOL)shouldIncludeUnit
291 _includesUnit = shouldIncludeUnit;
294 - (BOOL)zeroPadsFractionDigits
296 return _zeroPadsFractionDigits;
299 - (void)setZeroPadsFractionDigits:(BOOL)shouldZeroPad
301 _zeroPadsFractionDigits = shouldZeroPad;
324 _countStyle = [aCoder decodeIntForKey:CPByteCountFormatterCountStyleKey];
325 _allowsNonnumericFormatting = [aCoder decodeBoolForKey:CPByteCountFormatterAllowsNonnumericFormattingKey];
326 _includesActualByteCount = [aCoder decodeBoolForKey:CPByteCountFormatterIncludesActualByteCountKey];
327 _includesCount = [aCoder decodeBoolForKey:CPByteCountFormatterIncludesCountKey];
328 _includesUnit = [aCoder decodeBoolForKey:CPByteCountFormatterIncludesUnitKey];
329 _adaptive = [aCoder decodeBoolForKey:CPByteCountFormatterAdaptiveKey];
330 _zeroPadsFractionDigits = [aCoder decodeBoolForKey:CPByteCountFormatterZeroPadsFractionDigitsKey];
331 _allowedUnits = [aCoder decodeIntForKey:CPByteCountFormatterAllowedUnitsKey];
341 [aCoder encodeInt:_countStyle forKey:CPByteCountFormatterCountStyleKey];
342 [aCoder encodeBool:_allowsNonnumericFormatting forKey:CPByteCountFormatterAllowsNonnumericFormattingKey];
343 [aCoder encodeBool:_includesActualByteCount forKey:CPByteCountFormatterIncludesActualByteCountKey];
344 [aCoder encodeBool:_includesCount forKey:CPByteCountFormatterIncludesCountKey];
345 [aCoder encodeBool:_includesUnit forKey:CPByteCountFormatterIncludesUnitKey];
346 [aCoder encodeBool:_adaptive forKey:CPByteCountFormatterAdaptiveKey];
347 [aCoder encodeBool:_zeroPadsFractionDigits forKey:CPByteCountFormatterZeroPadsFractionDigitsKey];
348 [aCoder encodeInt:_allowedUnits forKey:CPByteCountFormatterAllowedUnitsKey];