实现像atm机器输入一样的文本字段输入

时间:2011-02-18 15:07:51

标签: iphone ios objective-c uitextfield text-formatting

我在iphone应用程序中有一个文本字段,我想实现类似于atms输入的输入,您只需输入数字(不需要输入小数字符)。我希望能够在此文本字段中使用数字键盘。例如,文本字段最初显示:

0.00

如果用户输入序列1234,则文本字段将如下所示:

12.34

如果用户按下删除按钮,也必须更新。

5 个答案:

答案 0 :(得分:6)

对于格式化,我认为您会对this other SO post中描述如何使用NSNumberFormatter显示前导和尾随零的详细信息感到非常满意。从该帖子中拉出并调整:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setFormat:@"##0.00"];

NSNumber* input; // Hook in your input
NSString* output = [NSString stringWithFormat:@"%@", [formatter stringFromNumber:input]]; // Hook to your text field

为了将1234的输入转换为12.34(并且可能是12的输入转换为0.12),请考虑您总是将输入的两位小数移位。

// int storedInput has already been set to 1234
int input = 5; // Next button that was pressed
storedInput = storedInput * 10 + input; // 1234 * 10 + 5 = 12345
float displayedValue = input * .01;  // 123.45
NSNumber* output = [NSNumber numberWithFloat:displayedValue];

这两个代码段应该让您了解如何在程序中实现这些概念。至于删除...只需将storedInput设置为0.每次键盘输入一个新输入时,您都可以调用这些代码来刷新值。

答案 1 :(得分:2)

我使用以下代码

取得了成功
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if(range.length==1)
    {
        if(enteredtext.length>1)
            enteredtext = [enteredtext substringWithRange:NSMakeRange(0,enteredtext.length-1)];
    }
    else
    {
        if(enteredtext.length<9)
            enteredtext = [NSString stringWithFormat:@"%@%@",enteredtext,string];
    }
    double amountindecimal = [enteredtext floatValue];
    double res=amountindecimal * pow(10, -2);
    NSString * neededstring = [NSString stringWithFormat:@"%.2f",res];
    if([neededstring isEqualToString:@"0.00"])
      enteredtext = @"0";
    textField.text = neededstring;
    return NO;
}

注意:

  • enteredtextstatic NSString
  • viewdidload fn中,设置enteredtext = @"0";
  • 将UITextfield初始文本设置为0.00
  • 将Textfield的Keyboardtype设置为NumberPad。
  • 此代码最多只能使用8位数字(999999.99)。

答案 2 :(得分:1)

简单,只需将文本字段对象的editingChanged事件连接到类中的方法,每次调用“editingChanged”方法时,删除所有“额外”字符(在您的情况下为小数点),如这样:

NSString *newContents = self.AtmTextField.text;
newContents = [newContents stringByReplacingOccurrencesOfString:@"." withString:@""];

然后根据需要重新格式化newContents,并将其重新设置为UITextField的文本

答案 3 :(得分:1)

我刚刚开通了内置此功能的源SATextField。只需将其fixedDecimalPoint设置为YES

编辑:我创建了一个包含此功能的新项目:STAControls(具体来说,使用STAATMTextField - 它甚至支持.入门!的)。不同之处在于,此项目已作为UITextField的合法子类实现,而SATextField仅仅是容纳UITextField实例的容器类。

答案 4 :(得分:0)

我的建议?摆脱文本领域。摆脱标准键盘并为任务添加自己的UIButtons。

我为应用做了类似的事情。我开始使用UITextField和默认键盘,但过了一段时间我发现如果我使用12个UIButtons和一个UILabel会更容易。