6

私はかなり簡単だと思うことをしようとしています。ユーザーにドルの金額を入力させ、その金額をNSNumber(NSDecimalNumber?)に保存し、後でその金額を通貨としてフォーマットして表示します。

私の問題は、setNumberStyle:NSNumberFormatterCurrencyStyleとfloatを通貨として表示することではそれほど問題ではありません。問題は、上記のnumberFormatterがこのUITextFieldでどのように機能するかということです。私はいくつかの例を見つけることができます。11月のこのスレッドとこのスレッドは私にいくつかのアイデアを与えてくれますが、もっと多くの質問があります。

私はUIKeyboardTypeNumberPadキーボードを使用しており、表示時にフィールドに$ 0.00(または任意の現地通貨形式)を表示し、ユーザーが数字を入力して小数点以下をシフトする必要があることを理解しています。

  • $0.00の表示から始めます
  • 2キーをタップ:$0.02を表示
  • 5キーをタップ:$0.25を表示
  • 4キーをタップ:$2.54を表示
  • 3キーをタップ:$25.43を表示

次に、[numberFormatter numberFromString:textField.text]は、NSNumber変数に格納できる値を提供するはずです。

悲しいことに、私はまだ苦労しています:これは本当に最良/最も簡単な方法ですか?もしそうなら、多分誰かが実装を手伝ってくれるでしょうか?UITextFieldには、すべてのキー押下に応答するデリゲートが必要な場合があると思いますが、何を、どこで、どのように実装するのかわかりません。サンプルコードはありますか?よろしくお願いします!私は高低を検索しました...

Edit1:それで、NSFormatterのstringForObjectValue:と、benzadoが推奨するものに最も近いものを調べています:UITextViewTextDidChangeNotification。どちらかでサンプルコードを見つけるのに本当に苦労しました...では、どこを見ればよいか知っているかどうか教えてください。

4

7 に答える 7

10

私の解決策:


- (BOOL)textField:(UITextField *)textField
    shouldChangeCharactersInRange:(NSRange)range 
    replacementString:(NSString *)string
{
  // Clear all characters that are not numbers
  // (like currency symbols or dividers)
  NSString *cleanCentString = [[textField.text
    componentsSeparatedByCharactersInSet:
    [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
      componentsJoinedByString:@""];
  // Parse final integer value
  NSInteger centAmount = cleanCentString.integerValue;
  // Check the user input
  if (string.length > 0)
  {
    // Digit added
    centAmount = centAmount * 10 + string.integerValue;
  }
  else
  {
    // Digit deleted
    centAmount = centAmount / 10;
  }
  // Update call amount value
  [_amount release];
  _amount = [[NSNumber alloc] initWithFloat:(float)centAmount / 100.0f];
  // Write amount with currency symbols to the textfield
  NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
  [_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
  [_currencyFormatter setCurrencyCode:@"USD"];
  [_currencyFormatter setNegativeFormat:@"-¤#,##0.00"];
  textField.text = [_currencyFormatter stringFromNumber:_amount];
  [_currencyFormatter release]
  // Since we already wrote our changes to the textfield
  // we don't want to change the textfield again
  return NO;
}

于 2010-05-29T15:57:34.477 に答える
1

私は怠け者であり、入力をその場で「私を助けるために」再フォーマットすることに耐えられないので、私は言います:

10進数を入力させるだけです。フィールドを離れたら、再フォーマットします。

于 2011-09-08T14:00:19.417 に答える
1

まあ、私はこれが良いと思います:

- (void)viewWillDisappear:(BOOL)animated{ [[NSNotificationCenter defaultCenter] removeObserver:self  name:UITextFieldTextDidChangeNotification object:nil]; }

-(void)viewDidAppear:(BOOL)animated{
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged:) name:UITextFieldTextDidChangeNotification object:nil];
}

-(void)textDidChanged:(NSNotification *)notification{
 [[NSNotificationCenter defaultCenter] removeObserver:self  name:UITextFieldTextDidChangeNotification object:nil];
 UITextField * textField= [notification object];
 NSString * sinPesos= [textField.text stringByReplacingOccurrencesOfString:@"$" withString:@""];
 NSString * sinPuntos= [sinPesos stringByReplacingOccurrencesOfString:@"." withString:@""];

 float monto = [sinPuntos floatValue]; 

 monto= monto/100;

 NSString * cardText= [[self montoFormatter] stringFromNumber:[NSNumber numberWithDouble:monto]]; 

 textField.text = ([cardText isEqualToString: @"0"] ? @"":cardText);
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged:) name:UITextFieldTextDidChangeNotification object:nil];
} 

-(NSNumberFormatter *)montoFormatter{
 NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
 [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
 [numberFormatter setMaximumFractionDigits:2];
 return [numberFormatter autorelease];
}

やってみて :)

于 2010-04-21T16:17:36.607 に答える
0

これが私の解決策です!

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    float valorUnit = [textField.text floatValue];

    if( string.length > 0)
    {
        float incremento = [string floatValue];

        valorUnit = valorUnit * 10.f + (incremento/100.f);
        NSString* strVal = [NSString stringWithFormat:@"%f", valorUnit];

        if (valorUnit > 0.f && valorUnit < 10.f) {
            textField.text  = [strVal substringToIndex:3];
        }
        else if (valorUnit < 100.f && valorUnit >= 10.f)
        {
            textField.text  = [strVal substringToIndex:4];
        }
        else if (valorUnit >=100.f && valorUnit <1000.f)
        {
            textField.text  = [strVal substringToIndex:5];
        }
        else {
            return NO;
        }

    }
    else {
        valorUnit = (valorUnit/10.f);
        NSString* strVal = [NSString stringWithFormat:@"%f", valorUnit];
        if (valorUnit > 0.f && valorUnit < 10.f) {
            textField.text  = [strVal substringToIndex:5];
        }
        else if (valorUnit < 100.f && valorUnit >= 10.f)
        {
            textField.text  = [strVal substringToIndex:6];
        }
        else if (valorUnit >=100.f && valorUnit <1000.f)
        {
            textField.text  = [strVal substringToIndex:7];
        }
        else {
            return NO;
        }
    }

return YES;

}

于 2009-12-18T03:21:41.120 に答える
0

まあ、これは少し遅いですが、とにかくこれを試してみようと思いました. これはおそらく回避策であり、コードが乱雑になる可能性がありますが、私にとってはうまくいきました。IB でラベルと非表示のテキスト フィールドを接続し、UITextFieldDelegate デリゲートを使用してこのコードを記述しました。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField == fineHiddenTextField) {
        NSString *fineText = [textField.text stringByReplacingCharactersInRange:range withString:string];
        if ([fineText length] == 0) {
            NSString *emptyFine = @"0.00";
            float fineValue = [emptyFine floatValue];
            fineEntryLabel.text = [NSString stringWithFormat:@"%.2f", fineValue];
        } else if ([fineText length] == 1) {
            NSString *firstDec = [NSString stringWithFormat:@"0.0%@", fineText];
            float fineValue = [firstDec floatValue];
            fineEntryLabel.text = [NSString stringWithFormat:@"%.2f", fineValue];
        } else if ([fineText length] == 2) {
            NSString *secondDec = [NSString stringWithFormat:@"0.%@", fineText];
            float fineValue = [secondDec floatValue];
            fineEntryLabel.text = [NSString stringWithFormat:@"%.2f", fineValue];
        } else {
            int decimalPlace = [fineText length] - 2;
            NSString *fineDollarAmt = [fineText substringToIndex:decimalPlace];
            NSString *fineCentsAmt = [fineText substringFromIndex:decimalPlace];
            NSString *finalFineValue = [NSString stringWithFormat:@"%@.%@", fineDollarAmt, fineCentsAmt];
            float fineValue = [finalFineValue floatValue];
            fineEntryLabel.text = [NSString stringWithFormat:@"%.2f", fineValue];
        }


        //fineEntryLabel.text = [NSString stringWithFormat:@"%.2f", fineValue];
        return YES;
    }
}

正確ではありませんが、本当に仕事を成し遂げました。最初の if ステートメントは、これがこの 1 つの特定の textField に対してのみ発生していることを確認するためのものでした (同じページ全体に複数あるため)。シンプルで使いやすいこと。ラベルを右から揃えるように設定するだけで、そうなるはずです。

私は今コーヒーに少し興味がありますが、質問があればお答えします。:)

于 2009-08-19T18:27:08.943 に答える