views:

1535

answers:

1

Hi

I have an unsigned long long value which I want to store into an NSString and retrieve from the string.

Initially I have the value in an NSNumber and I am using this to get the string

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

where myNum is an NSNumber.

To get back the NSNumber from the NSString I have to first get the unsigned long long value. But there is no method in the NSString class to do that (we just have one for getting the long long value, not the unsigned long long value).

Can someone please tell me how I can get back the value into an NSNumber variable.

Thanks.

+4  A: 

There are a lot of ways to accomplish this. The following is the most pragmatic:

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

// .. code and time in between when numStr was created
// .. and now needs to be converted back to a long long.
// .. Therefore, numStr used below does not imply the same numStr above.

unsigned long long ullvalue = strtoull([numStr UTF8String], NULL, 0);

This makes a few reasonable assumptions such as numStr will only contain numeric digits and it contains a 'valid' unsigned long long value. A drawback to this approach is that UTF8String creates what essentially amounts to [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes], or in other words something along the lines of 32 bytes of autoreleased memory per call. For the vast majority of uses, this is no problem what-so-ever.

For an example of how to add something like unsignedLongLongValue to NSString that is both very fast and uses no autoreleased memory as a side effect, take a look at the end of my (long) answer to this SO question. Specifically the example implementation of rklIntValue, which would require only trivial modifications to implement unsignedLongLongValue.

More information regarding strtoull can be found in its man page.

johne
Excellent answer. You could also just read the characters out in to a local temporary C string (since the characters are all digits, there is no UTF-8 or Unicode issues) and then use strtoull which would avoid the described drawback, but it would be a very weird case where your drawback was an actual issue in practice.
Peter N Lewis