5

私の目標は単純です。ローカライズされた通貨値 (たとえば $1,000.00) を格納するテキストフィールドがあり、テキストフィールドでテストを実行するために、テキストフィールドからその値を float として取得する必要があります。

コードは非常に単純です。最初に、次のように NSNumber を localizedString にフォーマットします。

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
formatter.locale = [NSLocale currentLocale];
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
textfield.text = [formatter stringFromNumber:number];

すべて正常に動作しますが、このローカライズされた文字列から doubleValue を取得するために逆のことを行います。

NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
formatter.locale = [NSLocale currentLocale];
formatter.numberStyle = NSNumberFormatterCurrencyStyle; //also tested with NSNumberFormatterDecimalStyle

double d = [formatter numberFromString:textfield.text].doubleValue;

問題は、フォーマッタが文字列の整数値のみを返し、小数点以下を返さないことです。さらに悪いことに、カナダのローカライズされた文字列 (20 000,00 $) の場合、20 しか返されません。

私はしばらくの間検索してきましたが、この動作について何も見つかりません。回避策はもちろん、テキストフィールドにフォーマットする直前に NSNumber を保存してから、この nsnumber をテストすることですが、私は本当にそれがきれいだとは思いません。

4

3 に答える 3

3

Swift では、同様にロケールを通貨の形式に設定してから double を取得することでこれを行うことができます。

    var locale = NSLocale.currentLocale()
    var formatter = NSNumberFormatter()
    formatter.locale = NSLocale(localeIdentifier: "en_US")
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle

    var moneyDouble = formatter.numberFromString(textField.text)?.doubleValue
于 2014-10-26T02:30:55.790 に答える
1

The answer, as pointed by Giuseppe, is really simple and I'm bashing my head against the wall for not thinking about it.

double d = [NSDecimalNumber decimalNumberWithString:textfield.text locale:[NSLocale currentLocale]].doubleValue;
于 2012-11-14T13:11:47.533 に答える
0

float を返し、ロケール識別子を強制しないen_US(Swift 2) という zavtra の回答のわずかな拡張:

func floatFromTextFieldText() -> Float {
    let formatter = NSNumberFormatter()
    formatter.locale = NSLocale.currentLocale()
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    guard let amount = self.text else { return 0.0 }
    return formatter.numberFromString(amount)!.floatValue
}
于 2016-02-16T20:19:49.827 に答える