2

我有一个 UILabel,它有一个格式化的字符串(格式化为货币),所以有一个美元符号,21.34 美元。

在核心数据实体中,属性是双精度类型,我使用 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,所以我的想法是删除美元符号,但我不知道该怎么做,或者也许有更好的方法来实现我的目标。

4

7 回答 7

10
    NSString* cleanedString = [costString stringByTrimmingCharactersInSet: [NSCharacterSet symbolCharacterSet]];

比上面的更强大(我认为它也可以处理逗号)

于 2010-02-18T16:12:20.800 回答
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;
于 2010-02-18T16:17:13.827 回答
2

要添加到@justin 的答案:

[NSCharacterSet symbolCharacterSet]

不会删除逗号。因此,您可以将其与:

stringByReplacingOccurrencesOfString

并使用:

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

得到一个适合算术的干净数字(例如£1,005.33变为1005.33

于 2012-07-07T00:25:14.350 回答
1

确实,您的价值应该是一个简单的数字,如果以货币交易,就像浮动一样。然后你应该有一个代表你的价值的字符串。您可以使用 NSNumberFormatter 从值获取字符串,就像您说的那样,但您不应该依赖字符串作为该值的唯一来源。

此外, NSDecimalNumber 对于表示货币之类的东西可能有点矫枉过正。NSDecimalNumber 更适合处理科学计数法中的数字。

一个简单的 NSNumber 对象就足以处理货币,使用类似numberWithDouble:.

于 2010-02-18T16:02:50.473 回答
1

结合@justin 和@leafy 的回答:

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

这会给你1000。

于 2015-03-02T22:28:42.507 回答
0

试试这个:

NSDecimalNumber *newAmount = [[NSDecimalNumber alloc] initWithString:[string substringFromIndex:1]];
于 2010-02-18T15:55:12.697 回答
0

如果您需要删除 $ 符号。为什么不在处理数字之前做以下事情

NSString *newStringValue = [inputString stringByReplacingOccurrencesOfString:@"$" withString:@""];
于 2010-04-23T06:39:16.073 回答