lundi 30 janvier 2012

Une autre catégorie de NSString

Si vous ne l'avais pas réalisé maintenant, j'aime catégories Objective-C. Ils nous donnent un endroit parfait pour mettre réutilisables logique qui agit sur les objets livrés, et je souhaite davantage de langues ont un mécanisme similaire.

For SQLitePersistentObjects, J'ai dû trouver dans quelques endroits, si une valeur stockée dans une NSString était en réalité un nombre à virgule flottante, un entier, ou une chaîne, alors j'ai écrit une catégorie d'ajouter quelques méthodes pour NSString. La première méthode vous indique si une chaîne donnée est maintenant un nombre à virgule flottante. Il tient compte des choses telles que le séparateur décimal, le symbole de groupement, et le symbole de la monnaie fondée sur la langue de l'utilisateur actuel et les paramètres de région. Ainsi, par exemple, une chaîne qui a tenu la valeur 123,456.00 $ serait identifié comme détenant une valeur de point valide flottante (123,456,00) sur mon système, mais pas sur le système de quelqu'un qui a vécu dans un pays qui utilise une virgule comme séparateur décimal. Vous pouvez l'appeler comme ceci:
BOOL isFloat = [@"12345.00" holdsFloatingPointValue];

Si vous avez besoin pour déterminer s'il s'agissait d'un nombre à virgule flottante à l'aide valable une langue différente, qui est également une option avec la deuxième méthode. Il fonctionne comme ceci:
BOOL isFloatForLocale = [@"123456.00" holdsFloatingPointValueForLocale:theLocale];

La troisième méthode vous indique si une chaîne contient une valeur entière.
BOOL isInteger = [@"12345" holdsIntegerValue];

Rien fracassantes ici, mais pourrait vous faire économiser du temps, quelque part sur la route. Cela devrait fonctionner tout aussi bien dans le cacao et Cocoa Touch.

Remarque: j'aurais pu, et aurait dû utiliser NSNumberFormatter à faire partie du travail localisés plus facilement. Pour certaines raisons, je ne pense pas que NSNumberFormatter était disponible sur l'iPhone, mais il est, donc j'aurais probablement pu sauvé moi-même quelques lignes de code.


En 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



En 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



Aucun commentaire: