Ipphones

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Thursday, 6 November 2008

Another Category on NSString

Posted on 18:47 by Unknown
If you hadn't realized it by now, I love Objective-C's categories. They give us a perfect place to put re-usable logic that acts on delivered objects, and I wish more languages had a similar mechanism.

For SQLitePersistentObjects, I had to figure out in a few places if a value stored in an NSString was actually a floating point number, an integer, or a string, so I wrote a category to add a few methods to NSString. The first method tells you if a given string is holding a floating point number. It takes into account such things as the decimal separator, the grouping symbol, and the currency symbol based on the current user's language and region settings. So, for example, a string that held the value $123,456.00 would be identified as holding a valid floating point value (123456.00) on my system, but not on the system of somebody who lived in a country that used a comma as the decimal separator. You can call it like this:
BOOL isFloat = [@"12345.00" holdsFloatingPointValue];

If you needed to determine if it was a valid floating point number using a different locale, that's also an option with the second method. It works like this:
BOOL isFloatForLocale = [@"123456.00" holdsFloatingPointValueForLocale:theLocale];

The third method tells you if a string contains an integer value.
BOOL isInteger = [@"12345" holdsIntegerValue];

Nothing earth-shattering here, but might save you some time somewhere down the road. This should work equally well in Cocoa and Cocoa Touch.

Note: I could have, and probably should have used NSNumberFormatter to do some of the localized work more easily. For some reason, I didn't think NSNumberFormatter was available on the iPhone but it is, so I probably could have saved myself a few lines of code.


In NSString-NumberStuff.h:
//
// NSString-NumberStuff.h
// CashFlow
//
// Created by Jeff LaMarche on 11/6/08.

#import <Foundation/Foundation.h>

@interface NSString(NumberStuff)
- (BOOL)holdsFloatingPointValue;
- (BOOL)holdsFloatingPointValueForLocale:(NSLocale *)locale;
- (BOOL)holdsIntegerValue;
@end



In NSString-NumberStuff.m:
//
// NSString-NumberStuff.m
// CashFlow
//
// Created by Jeff LaMarche on 11/6/08.
// Copyright 2008 Jeff LaMarche Consulting. All rights reserved.
//

#import "NSString-NumberStuff.h"


@implementation NSString(NumberStuff)
- (BOOL)holdsFloatingPointValue
{
return [self holdsFloatingPointValueForLocale:[NSLocale currentLocale]];
}
- (BOOL)holdsFloatingPointValueForLocale:(NSLocale *)locale
{
NSString *currencySymbol = [locale objectForKey:NSLocaleCurrencySymbol];
NSString *decimalSeparator = [locale objectForKey:NSLocaleDecimalSeparator];
NSString *groupingSeparator = [locale objectForKey:NSLocaleGroupingSeparator];


// Must be at least one character
if ([self length] == 0)
return NO;
NSString *compare = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

// Strip out grouping separators
compare = [compare stringByReplacingOccurrencesOfString:groupingSeparator withString:@""];

// We'll allow a single dollar sign in the mix
if ([compare hasPrefix:currencySymbol])
{
compare = [compare substringFromIndex:1];
// could be spaces between dollar sign and first digit
compare = [compare stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}

NSUInteger numberOfSeparators = 0;

NSCharacterSet *validCharacters = [NSCharacterSet decimalDigitCharacterSet];
for (NSUInteger i = 0; i < [compare length]; i++)
{
unichar oneChar = [compare characterAtIndex:i];
if (oneChar == [decimalSeparator characterAtIndex:0])
numberOfSeparators++;
else if (![validCharacters characterIsMember:oneChar])
return NO;
}
return (numberOfSeparators == 1);

}
- (BOOL)holdsIntegerValue
{
if ([self length] == 0)
return NO;

NSString *compare = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSCharacterSet *validCharacters = [NSCharacterSet decimalDigitCharacterSet];
for (NSUInteger i = 0; i < [compare length]; i++)
{
unichar oneChar = [compare characterAtIndex:i];
if (![validCharacters characterIsMember:oneChar])
return NO;
}
return YES;
}
@end

Email ThisBlogThis!Share to XShare to Facebook
Posted in Categories, Objective-C, Sample Code, snippet | No comments
Newer Post Older Post Home

0 comments:

Post a Comment

Subscribe to: Post Comments (Atom)

Popular Posts

  • Making OpenGL ES Screenshot
    The Bit-101 Blog has an entry that shows how to take a screenshot when using OpenGL ES . I tested this in my much-delayed particle-generato...
  • Adding CLANG to Your Build Process
    Frasier Spiers has a nifty piece this morning on using Git pre-commit hooks to automatically run the CLANG Static Analyzer. I'm not a G...
  • CLANG Static Analyzer
    If you aren't using the LLVM/Clang Static Analyzer , you really should be. The Clang Project is an attempt to write a front end for the...
  • A Little Help
    I'm having a problem with OpenGL ES, and it's keeping me from finishing my particle engine post. I was hoping someone here could see...
  • WWDC Accommodations
    Staying downtown in San Francisco is very expensive in the summertime. Bu, if you're going to WWDC, you really want to stay downtown. Yo...
  • Xcode File Templates and a Mystery
    One of the things that confuses many newcomers to Xcode is how to set it up so that your company name gets automatically filled in when you ...
  • Brain Surgery?
    Craig Hockenberry has an interesting post on his blog today about the iPhone background processing issue. Craig speaks from personal experi...
  • Book's Almost Done
    I just finished Chapter 16. I'll give it another read-over in the morning then it will go off to my writing partner for his review, then...
  • iPhone Alley
    Looks like Dave and I are going to make an appearance on the iPhone Alley Podcast next week. We're recording on Sunday night, so I woul...
  • Shuffling Arrays
    Ever want to randomize an array of items? It's a task that, for some reason, I've had to do a lot in recent programs. So, I wrote a ...

Categories

  • 3D Models
  • Ad Hoc Distribution
  • ADC
  • Address Book
  • Amazon
  • Anaglyphs
  • App Store
  • Apple
  • Apple DTS
  • Apple Store
  • Application Store
  • articles
  • Award
  • Background Processing
  • Barcodes
  • Beta
  • Blog
  • Blogger
  • Blogging
  • Blogs
  • Blogspot
  • Book project
  • Bug Reporting
  • Captain Obvious
  • Categories
  • Censorship
  • CFFoundation
  • CGAffineTransform
  • Clang Static Analyzer
  • Cocoa
  • Cocoa Touch
  • Code Reuse
  • Code Signing
  • Computer
  • conferences
  • Controller Classes
  • Core Animation
  • Daring Fireball
  • Database
  • Debugging
  • Defect
  • Delegates
  • Design Awards
  • Developer Certifications
  • Discussion Forums
  • Edit Mode
  • employment opportunities
  • Encryption
  • Enterprise
  • Errata
  • free code
  • Free software
  • Full Screen
  • Game Programming
  • Gestures
  • Getting Started
  • goof
  • Google Code
  • Google Maps
  • Gotcha
  • Help
  • HIG
  • HTTP PUT
  • Idiots
  • Idle Timer
  • Images
  • Instruments
  • Interface Builder
  • iPHone
  • iPhone Applications
  • iPhone Dev Center
  • iPhone Developers
  • iPhone OS 3.0
  • iPhone SDK
  • iPhone SDK PNG
  • iPhone Simulator
  • iPhoneSDK
  • iPod
  • Job Opportunities.
  • k
  • Key Value Observing
  • Keynote
  • KVO
  • Landscape Mode
  • Learn Cocoa
  • Learn Cocoa on the Mac
  • libxml
  • Licensing
  • Mac Developers
  • Mac OS X
  • Macworld Expo
  • Microsoft
  • NDA
  • NeHe
  • New Category
  • New Release
  • NSFileHandle
  • NSMutableArray
  • NSMutableURLRequest
  • NSXML
  • Object-Oriented Design
  • Objective-C
  • Open Source
  • OpenGL ES
  • Optimizations
  • Other blogs
  • Paired Arrays
  • Parsing
  • Particle Engine
  • Party
  • PeopleSoft
  • Performance
  • Persistence
  • Pink Screen of Death
  • Piracy
  • Pixar
  • Podcasts
  • Press Release WTF
  • Press Releases WTF
  • private APIs Google
  • Project Template
  • Properties
  • Random Numbers
  • Rant
  • Rejected
  • Resources
  • Responder Chain
  • REST
  • Reverse Engineering
  • Rumors
  • Runtime
  • Sample Code
  • Screencast
  • screenshot
  • Scroll Views
  • snippet
  • Snow Leopard.
  • SOAP
  • Sockets
  • Source
  • Splash Screen
  • SQLite
  • SQLitePersistentObjects
  • Steve Jobs
  • Steve-Note
  • Strings
  • Stupidity
  • Subversion
  • Table Views
  • Taps
  • Template
  • Tip
  • Tips
  • Tririga
  • tutorials
  • Twitter
  • UIAlertView
  • UIColor
  • UIImage
  • UIPickerView
  • UIScrollView
  • UITextField
  • UIView
  • UIWebView
  • Update
  • Utilities
  • UUID
  • Vacation
  • Version Control
  • Web Services
  • Writing
  • WTF
  • WWDC
  • Xcode
  • XML

Blog Archive

  • ►  2009 (141)
    • ►  May (14)
    • ►  April (30)
    • ►  March (48)
    • ►  February (26)
    • ►  January (23)
  • ▼  2008 (163)
    • ►  December (46)
    • ▼  November (25)
      • Shameless Post
      • Scratch That
      • A Novel Business Model
      • iPhone Alley
      • Adding Photos to iPhone Library
      • iPhone SDK & OS 2.2 is Out
      • Very Nice
      • "Officially" released
      • Daring Fireball on Google's use of Private APIs
      • Book is Shipping
      • Creating Transparent UIViews - a Rounded Rect View
      • A Note on Code Samples
      • Testing Code Signing
      • More Colors, More Compact
      • If you're in the Bay Area
      • Craig Hockenberry on Debugging again
      • Great Core Animation Project
      • Another Category on NSString
      • Captain Obvious Strikes Back
      • Test Code Formatting Post
      • TouchFighter
      • A Blog about Preventing iPhone App Piracy
      • Changing Application Name
      • Xcode File Templates and a Mystery
      • Interesting Blog
    • ►  October (44)
    • ►  September (2)
    • ►  August (5)
    • ►  July (2)
    • ►  June (9)
    • ►  May (2)
    • ►  April (11)
    • ►  March (17)
Powered by Blogger.

About Me

Unknown
View my complete profile