我正在寻找一种方法将字符串格式化为货币,而不使用TextField技巧。
例如,我想将数字"521242"转换为"5,212.42"。 或者,如果我有一个小于1美元的数字,我希望它看起来像这样:"52" -> "0.52"
谢谢
你可能想要像这样做(假设currency是一个浮点数):
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:currency]];
根据您的要求,将52视为.52,您可能需要除以100.0。NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:currency];
我使用这段代码。对我很有效。
1)将UITextField委托添加到头文件中
2)添加以下代码(启用ARC)
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
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
NSNumber *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];
return NO; }
Swift 2.0版本:
let _currencyFormatter : NSNumberFormatter = NSNumberFormatter()
_currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
_currencyFormatter.currencyCode = "EUR"
textField.text = _currencyFormatter.stringFromNumber(amount);
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[currency doubleValue]]];
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *cleanCentString = [[textField.text
componentsSeparatedByCharactersInSet:
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
componentsJoinedByString:@""];
// Parse final integer value
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithMantissa:[cleanCentString integerValue]
exponent:-2
isNegative:NO];
NSDecimalNumber *entry = [NSDecimalNumber decimalNumberWithMantissa:[string integerValue]
exponent:-2
isNegative:NO];
NSDecimalNumber *multiplier = [NSDecimalNumber decimalNumberWithMantissa:1
exponent:1
isNegative:NO];
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:2
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
NSDecimalNumber *result;
// Check the user input
if (string.length > 0)
{
// Digit added
result = [price decimalNumberByMultiplyingBy:multiplier withBehavior:handler];
result = [result decimalNumberByAdding:entry];
}
else
{
// Digit deleted
result = [price decimalNumberByDividingBy:multiplier withBehavior:handler];
}
// Write amount with currency symbols to the textfield
NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
[_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[_currencyFormatter setCurrencyCode:@"USD"];
textField.text = [_currencyFormatter stringFromNumber:result];
return NO;
}
func getCurrencyFormat(price:String)->String{
let convertPrice = NSNumber(double: Double(price)!)
let formatter = NSNumberFormatter()
formatter.numberStyle = .CurrencyStyle
formatter.currencyCode = "USD"
let convertedPrice = formatter.stringFromNumber(convertPrice)
return convertedPrice!
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
let strMain : NSString = string
let arrTemp : NSArray = (textField.text?.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))!
let str: NSString = arrTemp.componentsJoinedByString("")
//NSInteger centAmount = cleanCentString.integerValue;
var centAmount : NSInteger = str.integerValue
if (string.length > 0)
{
// Digit added
centAmount = centAmount * 10 + strMain.integerValue;
}
else {
// Digit deleted
centAmount = centAmount / 10;
}
let amount = (Double(centAmount) / 100.0)
let currencyFormatter = NSNumberFormatter()
currencyFormatter.numberStyle = .CurrencyStyle
currencyFormatter.currencyCode = "USD"
currencyFormatter.negativeFormat = "-¤#,##0.00"
let convertedPrice = currencyFormatter.stringFromNumber(amount)
print(convertedPrice)
txtAmount.text = convertedPrice! //set text to your textfiled
return false //return false for exact out put
}
currencyFormatter.currencyCode = nil
currencyFormatter.currencySymbol = ""
愉快的编程!
lazy
是避免这种开销的完美解决方案。这也将许多样板代码移到主要代码之外,使其更加简洁明了。class MyViewController: UIViewController {
@IBOutlet var priceLabel: UILabel!
private lazy var currencyFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.currencySymbol = "$"
formatter.numberStyle = .currency
return formatter
}()
// rest of class
}
如先前所述,使用 Decimal
表示货币最佳,而 Double
则只是近似值。
priceLabel.text = currencyFormatter.string(for: Decimal(9.48))
输出:
$9.48
NSDecimalNumber
非常轻量级;即使实时进行数千次计算,我也从未遇到过任何问题。) - Conrad Shultz