From a060bea69d8a3417dd9a72dd8e298a20a61cc34d Mon Sep 17 00:00:00 2001 From: Craig Gidney Date: Tue, 7 Oct 2014 11:25:27 -0400 Subject: [PATCH] Found a method to parse NSUInteger exactly and precisely //FREEBIE --- Signal/src/util/StringUtil.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Signal/src/util/StringUtil.m b/Signal/src/util/StringUtil.m index 5012c2c7a..5159869fc 100644 --- a/Signal/src/util/StringUtil.m +++ b/Signal/src/util/StringUtil.m @@ -134,7 +134,14 @@ -(NSNumber*) tryParseAsDecimalNumber { NSNumberFormatter* formatter = [NSNumberFormatter new]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; - return [formatter numberFromString:self]; + + // NSNumberFormatter.numberFromString is good at noticing bad inputs, but loses precision for large values + // NSDecimalNumber.decimalNumberWithString has perfect precision, but lets bad inputs through sometimes (e.g. "88ffhih" -> 88) + // We use both to get both accuracy and detection of bad inputs + if ([formatter numberFromString:self] == nil) { + return nil; + } + return [NSDecimalNumber decimalNumberWithString:self]; } -(NSNumber*) tryParseAsUnsignedInteger { NSNumber* value = [self tryParseAsDecimalNumber];