Objective-C - 如何从字符串中删除字符?

3

我有一个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
    NSString* cleanedString = [costString stringByTrimmingCharactersInSet: [NSCharacterSet symbolCharacterSet]];

这个方法比上面那个更加健壮(我认为它还可以处理逗号)


5

好的,我最终使用了这段代码,它对我有效。

        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
这太过繁琐了。你可以使用NSNumberFormatter来去除字符串周围的格式并将其转换为NSNumber。如果遇到货币符号在数字右侧的情况,你的代码也会出问题,而使用NSNumberFormatter则可以正确处理此类情况。 - Dave DeLong
1
货币符号的位置并不重要,代码实际上是在寻找任何与NSCharacterSet不匹配的字符,并将其从字符串中删除,如果它不在该集合中。 - iAm

2

补充@justin的回答:

[NSCharacterSet symbolCharacterSet]

不会移除逗号。因此您可以将其与以下内容组合使用:

stringByReplacingOccurrencesOfString

并使用:

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

为了得到适合进行算术运算的干净数字(例如,£1,005.33 变成 1005.33


1
如果您需要移除美元符号,为什么不在处理数字之前执行以下操作呢?
NSString *newStringValue = [inputString stringByReplacingOccurrencesOfString:@"$" withString:@""];

1

你应该有一个表示简单数字(如货币的浮点数)的值,然后你应该有一个表示该值的字符串。你可以使用NSNumberFormatter从值到字符串进行转换,就像你所说的那样,但你不应该仅仅依赖于字符串作为该值的唯一来源。

此外,NSDecimalNumber可能过于复杂,用于表示类似于货币的东西。NSDecimalNumber更适合处理科学计数法中的数字。

对于使用货币,一个简单的NSNumber对象就足够了,可以使用类似于numberWithDouble:的东西。


2
请不要说NSDecimalNumber过于复杂。在许多应用程序中,特别是处理财务数据时,它恰好是正确的选择。 - Ole Begemann
一个数字格式,其中像0.1这样的简单数字如果不引入舍入误差就无法表示,对于许多处理金融数据的应用程序来说并不是非常适合。浮点数在许多方面都很好,但精确的财务计算不是它的强项。 - Ole Begemann
1
很抱歉,但处理货币时 NSDecimalNumber 是正确的类型,谢谢。 - iAm
2
@Jasarien:是的。但它不能准确地表示许多简单的数字(例如0.1)。无论fp单元的精度如何。 - Ole Begemann
1
我希望你是在开玩笑。如果是钱的话,请使用NSDecimalNumber - Steven Fisher
显示剩余2条评论

1
将 @justin 和 @leafy 的答案合并:
[[@"$1,000" stringByReplacingOccurrencesOfString:@"," withString:@""] stringByTrimmingCharactersInSet: [NSCharacterSet symbolCharacterSet]];

这将给你1000。

0

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接