2

書式設定された文字列 (通貨用に書式設定された) を持つ 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 にならないようにする必要があるので、ドル記号を削除することを考えていますが、その方法がわからないか、目標を達成するためのより良い方法があるかもしれません。

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.331005.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

$記号を削除する必要がある場合。番号を扱う前に、次のことをしてみませんか

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

これを試して:

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