Ios 为货币设置UITextField的格式
我的应用程序中有一个UITextField,它只接收用户的数字输入。此数字输入表示货币,默认值为0.00 我想创建一个掩码,以便在用户输入数字时格式化UITextField。例如: 9变成0,09美元 99变成0,99美元 999变成999,99美元 下面的代码工作得很好,但由于我使用整数和浮点值,应用程序最终会在某一点上显示错误的值。例如: 999999999变为100000000 这是因为flot和integer不够精确,应该使用NSDEcimalNumber。问题是,我不知道如何将整数和浮点值替换为小数1 有人能帮我解决这个问题吗?我花了一些时间在网上搜索解决方案,但没有找到适合我的需要和有同样问题的人 代码如下: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。问题是,我不知道如何将整数和浮
-(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]。