Objective-C - Как удалить символы из строки? - PullRequest
1 голос
/ 18 февраля 2010

У меня есть UILabel с отформатированной строкой (отформатированной для валюты), поэтому есть знак доллара, $ 21,34.

В основном объекте данных атрибут имеет тип double, я использую NSDecimalNumber для сохранения в базе данных.

    self.purchase.name = self.nameTextField.text;
    NSString *string = self.amountLabel.text
    NSDecimalNumber *newAmount = [[NSDecimalNumber alloc] initWithString:string];
    NSLog(@"%@", string); // THIS RETURNS NaN, because of dollar sign i think

    NSManagedObjectContext *context = self.purchase.managedObjectContext;

    NSError *error = nil;
    if (![context save:&error]) 
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

В любом случае, мне нужно, чтобы это не было NaN, поэтому я думаю убрать знак доллара, но я не знаю, как это сделать, или, возможно, есть лучший способ достичь моей цели.

Ответы [ 7 ]

10 голосов
/ 18 февраля 2010
    NSString* cleanedString = [costString stringByTrimmingCharactersInSet: [NSCharacterSet symbolCharacterSet]];

намного надежнее, чем предыдущий (и я думаю, что он будет обрабатывать запятые тоже)

5 голосов
/ 18 февраля 2010

ОК, поэтому я использовал этот код, и он работает для меня

        NSString *inString = self.amountLabel.text;
    NSMutableString *outString = [NSMutableString stringWithCapacity:inString.length];

    NSScanner *scanner = [NSScanner scannerWithString:inString];
    NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];

    while ([scanner isAtEnd] == NO)
    {
        NSString *buffer;
        if ([scanner scanCharactersFromSet:numbers intoString:&buffer])
        {
            [outString appendString:buffer];
        }
        else {
            [scanner setScanLocation:([scanner scanLocation] + 1)];
        }

    }
    NSLog(@"%@", outString);
    NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:outString];

    self.purchase.amount = amount;
2 голосов
/ 07 июля 2012

Чтобы добавить к ответу @ Джастина:

[NSCharacterSet symbolCharacterSet]

не удаляет запятые. Таким образом, вы можете комбинировать это с:

stringByReplacingOccurrencesOfString

и использование:

    NSString* cleanedString = [[costString stringByReplacingOccurrencesOfString:@"," withString:@""] 
stringByTrimmingCharactersInSet: [NSCharacterSet symbolCharacterSet]];

для получения очищенного числа, подходящего для арифметики (например, £ 1,005,33 становится 1005,33 )

1 голос
/ 03 марта 2015

Сочетание ответа @ Джастина и @ Лифи:

[[@"$1,000" stringByReplacingOccurrencesOfString:@"," withString:@""] stringByTrimmingCharactersInSet: [NSCharacterSet symbolCharacterSet]];

Это даст вам 1000.

1 голос
/ 18 февраля 2010

На самом деле вы должны иметь свое значение, которое представляет собой простое число, например, число с плавающей точкой, если вы имеете дело с валютой. Тогда у вас должна быть строка, представляющая ваше значение. Вы можете использовать NSNumberFormatter для перехода от значения к строке, как вы говорите, но вы не должны полагаться на строку как на единственный источник этого значения.

Кроме того, NSDecimalNumber, вероятно, является избыточным для представления чего-то вроде валюты. NSDecimalNumber лучше подходит для работы с числами в научной нотации.

Простой объект NSNumber будет достаточно хорош для работы с валютой, используя что-то вроде numberWithDouble:.

0 голосов
/ 23 апреля 2010

Если вам нужно убрать знак $.почему бы просто не сделать следующее, прежде чем иметь дело с номером

NSString *newStringValue = [inputString stringByReplacingOccurrencesOfString:@"$" withString:@""];
0 голосов
/ 18 февраля 2010

Попробуйте это:

NSDecimalNumber *newAmount = [[NSDecimalNumber alloc] initWithString:[string substringFromIndex:1]];
...