2016-03-31 4 views
0

J'ai un tableau d'objets numéro de téléphone, le modèle de numéro de téléphone est le suivant:Recherche par NSArray d'objets avec différents paramètres régionaux

@property NSString *hotlineName; 
@property NSString *hotlineNameAr; 
@property NSString *hotlineNumber; 
@property NSString *hotlineImage; 
@property NSInteger hotlineID; 
@property RLMArray<Tags> *hotlineTags; 

quand j'effectuer une recherche, je filtre le tableau si l'hotlineName, hotlineNameAr , hotlineNumber et dans la propriété hotlineTags: tagName et tagNameAr contiennent le texte recherché.

J'utilisé NSPredicate pour filtrer le tableau en tant que tel:

-(void) searchForText: (NSString *) searchText{ 

    NSString *predicateFormat = @"SELF.%K contains[cd] %@"; 
    NSString *tagFormat = @"ANY SELF.hotlineTags.%K contains[cd] %@"; 

    NSString *searchNameAttribute = @"hotlineName" ; 
    NSString *searchTagAttribute = @"tagName"; 
    NSString *searchNameAttribute_ar = @"hotlineNameAr" ; 
    NSString *searchTagAttribute_ar = @"tagNameAr"; 
    NSString *numberAttribute = @"hotlineNumber"; 

    NSPredicate *namePredicate = [NSPredicate predicateWithFormat:predicateFormat, searchNameAttribute, searchText]; 

    NSPredicate *tagPredicate = [NSPredicate predicateWithFormat:tagFormat, searchTagAttribute, searchText]; 

    NSPredicate *namePredicate_ar = [NSPredicate predicateWithFormat:predicateFormat, searchNameAttribute_ar, searchText]; 

    NSPredicate *tagPredicate_ar = [NSPredicate predicateWithFormat:tagFormat, searchTagAttribute_ar, searchText]; 

    NSPredicate *numberPredicate = [NSPredicate predicateWithFormat:predicateFormat, numberAttribute, searchText]; 

    NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[namePredicate, numberPredicate, tagPredicate, namePredicate_ar, tagPredicate_ar]]; 

    filteredResults = [hotlines_arr filteredArrayUsingPredicate:predicate]; 
} 

et jusqu'à présent, cela fonctionne bien, le problème se pose quand je recherche avec des chiffres dans un lieu différent, en l'occurrence en arabe, donc utilisé I NSNumberFormatter en tant que tel:

// Convert string From Arabic/Persian numbers to English numbers 
+(NSString *) convertToEnglishNumber:(NSString *) string { 

    // NSNumericSearch 
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    formatter.numberStyle = NSNumberFormatterDecimalStyle; 
    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"EN"]; 
    [formatter setLocale:locale]; 
    NSNumber *number = [formatter numberFromString:string]; 

    return [number stringValue]; 

} 

mais le problème avec NSNumberFormatter est que tout zéro sont désormais ignorés dans la conversion, donc je besoin d'une alternative pour formater la NSString en fonction des paramètres régionaux ou rechercher ensemble tout en prenant en locale considération, le même option dans spotl ight recherche. J'ai également essayé le formatage en tant que tel mais c'était en vain.

NSString *str = [[NSString alloc] initWithFormat:@"%@" locale:locale, searchText]; 

NSString *localizedString =[NSString localizedStringWithFormat:@"%@", searchText]; 
+0

Dans 'NSNumberFormatter' vous devrait être en mesure de définir combien de zéro principal vous avez besoin. – Larme

+0

Mais je n'ai aucune idée du nombre de zéro que je vais avoir. C'est une recherche contenant ... –

+1

Eh bien, le nombre qui précède zéro n'est pas la différence entre la [[longueur de chaîne] '' et la [[longueur de chaîne de nombre]]]? – Larme

Répondre

0

Comme je ne pouvais pas penser à une autre option et ce fut un dernier recours, je fini par remplacer la chaîne mais je suis très satisfait de la réponse:

+ (NSString *) replaceStrings: (NSString *) textToEdit{ 
    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"ar"]; 
    for (NSInteger i= 0; i < 10; i++) { 
     NSString *stringVal = [@(i) stringValue]; 
     NSString *localeString = [@(i) descriptionWithLocale:locale]; 
     textToEdit = [textToEdit stringByReplacingOccurrencesOfString:localeString withString:stringVal]; 
    } 
    return textToEdit; 
}