Ios 为货币设置UITextField的格式

Ios 为货币设置UITextField的格式,ios,objective-c,uitextfield,Ios,Objective C,Uitextfield,我的应用程序中有一个UITextField,它只接收用户的数字输入。此数字输入表示货币,默认值为0.00 我想创建一个掩码,以便在用户输入数字时格式化UITextField。例如: 9变成0,09美元 99变成0,99美元 999变成999,99美元 下面的代码工作得很好,但由于我使用整数和浮点值,应用程序最终会在某一点上显示错误的值。例如: 999999999变为100000000 这是因为flot和integer不够精确,应该使用NSDEcimalNumber。问题是,我不知道如何将整数和浮

我的应用程序中有一个UITextField,它只接收用户的数字输入。此数字输入表示货币,默认值为0.00

我想创建一个掩码,以便在用户输入数字时格式化UITextField。例如:

9变成0,09美元 99变成0,99美元 999变成999,99美元

下面的代码工作得很好,但由于我使用整数和浮点值,应用程序最终会在某一点上显示错误的值。例如:

999999999变为100000000

这是因为flot和integer不够精确,应该使用NSDEcimalNumber。问题是,我不知道如何将整数和浮点值替换为小数1

有人能帮我解决这个问题吗?我花了一些时间在网上搜索解决方案,但没有找到适合我的需要和有同样问题的人

代码如下:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.tag == 1){
    NSString *cleanCentString = [[textField.text componentsSeparatedByCharactersInSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
    NSInteger centValue= cleanCentString.integerValue;

    if (string.length > 0)
    {
        centValue = centValue * 10 + string.integerValue;
    }
    else
    {
        centValue = centValue / 10;
    }

    NSNumber *formatedValue;
    formatedValue = [[NSNumber alloc] initWithFloat:(float)centValue / 100.0f];
    NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
    [_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    textField.text = [_currencyFormatter stringFromNumber:formatedValue];
    return NO;
}

if (textField.tag == 2){
    // Nothing for now
}

return YES;
}

您可以通过以下方式将整数值或双精度/浮点值转换为字符串:

NSString *str = [@(myInt) stringValue];
NSString *str1 = [[NSNumber numberWithFloat:myFloat] stringValue];
之后,您可以通过多种方式将字符串转换为NSDecimalNumber。比如:

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", number);
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:@"100.1" locale:NSLocale.currentLocale];
NSLog(@"%@",num);
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setLocale:[NSLocale currentLocale]];
NSLog(@"%@", [formatter stringFromNumber:number]);
NSNumberFormatter将帮助您设置正确的格式。请阅读苹果一页,了解和。 NSNumberFormatter包含一个名为“配置货币格式”的部分。我没有试过,但它似乎对你有帮助


如果有帮助,请告诉我:)

实施
UITextFieldDelegate
并添加下一个方法:

Swift:

let currencySign = "$"

// Adds $ before the text, e.g. "1" -> "$1" and allows "." and ","
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
    {
    var value = textField.text

    var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
    var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet)

    var decimalString = "".join(components) as NSString
    var length = decimalString.length

    if length > 0 {
        value = "\(currencySign)\(decimalString)"
    }
    else {
        value = ""
    }
    textField.text = value
}

// Formats final value using current locale, e.g. "130,50" -> "$130", "120.70" -> "$120.70", "5" -> "$5.00"
func textFieldDidEndEditing(textField: UITextField) {
        var value = textField.text
        var components = value.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "1234567890,.").invertedSet)
        var decimalString = "".join(components) as NSString

        let number = NSDecimalNumber(string: decimalString, locale:NSLocale.currentLocale())

        var formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        formatter.locale = NSLocale.currentLocale()

        if let formatedValue = formatter.stringFromNumber(number) {
            textField.text = formatedValue
        }
        else {
            textField.text = ""
        }
}

你有一个更大的问题。假设输入的货币为货币值的100分之一,如美分。例如,日本人不会高兴,因为日元只是整日元。在将数字格式化程序设置为货币样式后,您应该询问它,并查看它的小数位数设置。您是对的,rmaddy。backlog持续增加=DPersonally我认为最好是让用户输入一个原始数字,而不进行“格式化即用”处理。在用户离开文本字段之前,不要格式化原始数字。作为一个用户,我宁愿在实际需要小数点时输入小数点分隔符。如果我键入
9
,那么我的意思是九美元,而不是九美分。如果我要九美分,那么我要键入
.09
。在我完成键入后,让后处理格式更改为
$0.09
或其他格式。不要让我键入
900
得到九美元。但这只是一个观点。这是一个有趣的观点。“也许更好。”卡洛斯,我用的是你的方法,也遇到了同样的问题。我检查下面的答案,但有些问题我无法解决。你能帮我解决这个问题吗。你能修改同样的方法吗?谢谢,拉沙德!将字符串中的值转换为NSDecimalNumber非常有效,即使对于货币也是如此。但是现在我得到了'nsdecimalnumberroverflowexception',因为我这样做:result=[decimalValue decimalNumberByMultiplyingBy:base];结果=[decimalValue DecimalNumberByDivingBy:base]@卡洛斯>>你解决问题了吗?我正在仔细检查我的答案。所以我只是问我决定稍微改变一下,让用户输入一个原始数字。但是我没有找到“NSDecimalNumberOverflowException error=/的解决方案。如果操作中使用的数字不是有效数字,则通常会导致此错误。请仔细检查您的号码。您可以在执行指令之前使用以下内容进行检查:[NSDecimalNumber notANumber]。