当前位置:  开发笔记 > IOS > 正文

在Cocoa挣扎着货币

如何解决《在Cocoa挣扎着货币》经验,为你挑选了1个好方法。

我正在尝试做一些我认为相当简单的事情:让用户输入一个美元金额,将该金额存储在NSNumber(NSDecimalNumber?)中,然后在稍后的某个时间再次显示格式化为货币的金额.

我的麻烦不在于setNumberStyle:NSNumberFormatterCurrencyStyle并将浮动显示为货币.问题更多的是所述numberFormatter如何与这个UITextField一起工作.我可以找到一些例子.这个帖子来自十一月,这个给我一些想法,但给我留下了更多的问题.

我正在使用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.很难在其中任何一个上找到示例代码......所以如果你知道在哪里看,请告诉我?



1> Lars Schneid..:

我的解决方案

- (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;
}

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有