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

输入带小数点的数值的最佳方法是什么?

如何解决《输入带小数点的数值的最佳方法是什么?》经验,为你挑选了3个好方法。

在我的应用中,用户需要能够输入带小数位的数值.iPhone没有提供专门用于此目的的键盘 - 只有数字键盘和带数字和符号的键盘.

是否有一种简单的方法来使用后者并防止输入任何非数字输入而无需正则表达式最终结果?

谢谢!



1> Zebs..:

我想最好指出,从iOS 4.1开始,你可以使用新的UIKeyboardTypeDecimalPad.

所以现在你必须:

myTextField.keyboardType=UIKeyboardTypeDecimalPad;


谢谢!为什么界面构建器没有这个选项?即使在Xcode4中它也不存在......
@Thomas不,不是.那是一个不同的键盘

2> shek..:

更优雅的解决方案恰好也是最简单的.

您不需要小数分隔符键

为什么?因为您可以简单地从用户的输入中推断它.例如,在您输入1.23美元的美国语言环境中,首先输入数字1-2-3(按此顺序).在系统中,当输入每个字符时,这将被识别为:

用户输入1:0.01美元

用户输入2:$ 0.12

用户输入3:1.23美元

请注意我们如何根据用户的输入推断出小数分隔符.现在,如果用户想要输入$ 1.00,他们只需输入数字1-0-0.

为了使您的代码能够处理不同语言环境的货币,您需要获取货币的最大小数位数.这可以使用以下代码段完成:

NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
int currencyScale = [currencyFormatter maximumFractionDigits];

例如,日元的最大分数为0.因此,在处理日元输入时,没有小数分隔符,因此无需担心分数.

这种解决问题的方法允许您使用Apple提供的库存数字输入键盘,而不会出现自定义键盘,正则表达式验证等问题.


最初的问题没有说明货币,但这个答案几乎假设我们想要输入货币.如果要接受任意浮点输入,这没有用.
作为一个用户,如果我想输入一个通用的小数值或一个货币值,我发现输入100会相当恼人.例如,对于货币,如果应用程序提示我输入金额,我预计将以美元或欧元或日元输入,而不是美分(即100美元或欧元).因此,我希望能够输入"1"来表示1美元.您的建议强制用户仔细检查输入"1"实际上没有输入$ 1而是$ .01.这通常不是用户期望的.
只是为了确保 - 不要使用浮动货币!
有一点 - 遗憾的是iPhone SDK UIControl不支持setFormatter方法,允许您将NSFormatter附加到UITextField或其他UIControl(等效的Cocoa NSControl支持setFormatter).我向Apple提出了一个增强问题(#5847381).

3> Mike Weller..:

以下是已接受答案中建议的解决方案示例.这不处理其他货币或任何东西 - 在我的情况下,我只需要支持美元,无论当地/货币是什么,所以这对我来说还可以:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
    replacementString:(NSString *)string {

    double currentValue = [textField.text doubleValue];
    //Replace line above with this
    //double currentValue = [[textField text] substringFromIndex:1] doubleValue];
    double cents = round(currentValue * 100.0f);

    if ([string length]) {
        for (size_t i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (isnumber(c)) {
                cents *= 10;
                cents += c - '0'; 
            }            
        }
    } else {
        // back Space
        cents = floor(cents / 10);
    }

    textField.text = [NSString stringWithFormat:@"%.2f", cents / 100.0f];
    //Add this line
    //[textField setText:[NSString stringWithFormat:@"$%@",[textField text]]];
    return NO;
}

轮和层是重要的a)因为浮点表示有时会丢失.00001或其他什么,以及b)格式字符串舍入我们在退格部分中删除的任何精度.

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