1

アプリに通貨入力フィールドを用意して、ユーザーが通貨記号を (ロケールに応じて) 含めるか、含めないかを自由に選択できるようにしたいと考えています。

テキスト フィールドを設定し、値を NSDecimalNumber に格納しています (これは、通貨を格納するための推奨される方法であると理解しています)。

次のコードは、NSDecimalNumber から書式設定された通貨文字列に変換します。

[NSNumberFormatter localizedStringFromNumber:currencyValue numberStyle:NSNumberFormatterCurrencyStyle]

しかし、その逆を行う方法が見つかりません。つまり、ユーザーがテキスト フィールドに入力した文字列を (可能であれば) NSDecimalNumber に変換します。通貨記号がそこにある (上記の関数から来たため) か、そうでない (ユーザーがわざわざ通貨記号を入力しなかったため) 可能性があることに注意してください。

私は何が欠けていますか?

これがわからない場合は、通貨記号をまったく受け入れません (つまり、以下のコードを使用して解析するだけです)。しかし、通貨記号を許可した方がよさそうです。

[NSDecimalNumber decimalNumberWithString:currencyString locale:[NSLocale currentLocale]]

私は何かが欠けていると感じています。ローカライズされた通貨文字列と NSDecimalNumber の間で相互に変換する正しい方法は何ですか?

4

2 に答える 2

1

NSNumberFormatter のインスタンスを取得する場合 (静的メソッド呼び出しを使用する代わりに)、NSNumberFormatter の "stringFromNumber" メソッドを使用して通貨文字列をフォーマットし、"numberFromString" を使用してその文字列を解析して数値に戻すことができます。

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Classes/NSNumberFormatter_Class/Reference/Reference.html

于 2014-08-24T15:57:34.557 に答える
0

通貨記号が存在する場合、それが文字列の先頭にあることが確実な場合は、これをそのまま使用できます (文字列はユーザ​​ーが入力する NSString であり、数値は通貨の値を表す NSDecimalNumber です)。

NSDecimalNumber *number;
if([string hasPrefix:@"0"] || [string hasPrefix:@"1"] || [string hasPrefix:@"2"] || [string hasPrefix:@"3"] || [string hasPrefix:@"4"] || [string hasPrefix:@"5"] || [string hasPrefix:@"6"] || [string hasPrefix:@"7"] || [string hasPrefix:@"8"] || [string hasPrefix:@"9"]) {
    // The string does not contain a currency symbol in the beginning so we can just assign that to a NSDecimalNumber
    number = [NSDecimalNumber decimalNumberWithString:string];
}
else {
    // The string contains a currency symbol at the beginning and we will assign the currency symbol to the currencySymbol variable
    NSString *currencySymbol;
    currencySymbol = [string substringWithRange:NSMakeRange(0,1)];
    number = [NSDecimalNumber decimalNumberWithString:[string stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:@""];
}
于 2013-09-10T02:58:55.923 に答える