Iphone 如何在ios上正确设置货币格式
我正在寻找一种不使用TextField hack将字符串格式化为货币的方法 例如,我想把数字“521242”转换成“5212.42” 或者如果我有一个低于1美元的数字,我希望它看起来像这样:“52”->“0.52”Iphone 如何在ios上正确设置货币格式,iphone,ios,numbers,currency,formatter,Iphone,Ios,Numbers,Currency,Formatter,我正在寻找一种不使用TextField hack将字符串格式化为货币的方法 例如,我想把数字“521242”转换成“5212.42” 或者如果我有一个低于1美元的数字,我希望它看起来像这样:“52”->“0.52” 谢谢您可能想要这样的东西(假设货币是浮动的): 根据您将52视为.52的要求,您可能需要除以100.0 这种方法的优点是它将尊重当前的语言环境。因此,在适当的情况下,它会将您的示例格式化为“5.212,42” 更新: 也许,我在发布我的示例时有点快。正如康拉德·舒尔茨(Conrad
谢谢您可能想要这样的东西(假设货币是浮动的): 根据您将52视为.52的要求,您可能需要除以100.0 这种方法的优点是它将尊重当前的语言环境。因此,在适当的情况下,它会将您的示例格式化为“5.212,42” 更新: 也许,我在发布我的示例时有点快。正如康拉德·舒尔茨(Conrad Shultz)在下文中指出的,在处理货币金额时,最好将数量存储为
NSDecimalNumber
s。这将大大减少舍入误差带来的麻烦。如果执行此操作,上述代码段将变为(假设货币为NSDecimalNumber*
):
我使用这个代码。这是我的工作 1) 将UITextField委托添加到头文件 2) 添加此代码(已启用ARC)
使用以下代码,它将解决您的所有问题
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[currency doubleValue]]];
这就是我发现的使用NSDEcimalNumber修改AAV答案
- (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;
}
swift 2.0版本:
let _currencyFormatter : NSNumberFormatter = NSNumberFormatter()
_currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
_currencyFormatter.currencyCode = "EUR"
textField.text = _currencyFormatter.stringFromNumber(amount);
注:-货币代码是三个字母的代码,在大多数情况下,
由一个国家的两个字符的互联网国家代码加上
表示货币单位的额外字符。例如
澳元的货币代码为“澳元”。用于Swift测试代码(参考AAV代码) 注意:如果要从输入中删除默认货币符号,可以使用currencySymbol将其留空,如下所示
currencyFormatter.currencyCode = nil
currencyFormatter.currencySymbol = ""
快乐编码 使用格式化程序的一个原因是它们的创建成本很高。最好为每个视图或viewController创建一次。使用
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
}
要使用它,如其他地方所述,最好使用十进制
作为货币,双精度
是一种近似值
priceLabel.text = currencyFormatter.string(for: Decimal(9.48))
输出:
$9.48
绝对不要对精确值(尤其是货币)使用浮动!使用NSDecimalNumber/NSDecimalNumber。由于日元没有像美分这样的数字,当您硬编码除以100时,如何确保日元的日文格式正确。。。比较
Locale Awareness
on,如果将1000日元格式化为日元,它将变为“¥1000”。我真的需要为每个受支持的国家/地区维护一个包含分割因子的映射表吗?还是有一个NumberFormatter选项?绝对不要对精确值(尤其是货币)使用浮动!使用NSDecimalNumber/NSDecimal.Awesome!我让它工作,但却在努力处理双小数。。很明显,我错过了。谢谢大家!@康拉德舒尔茨(+1)这是一个很好的观点,但我倾向于避免这种笼统的说法。可以精确地用十进制表示的事物可以很快变成精确的(例如,我把你的“精确”数字除以三)。NSDecimalNumber/NSDecimal的性能开销很快就会超过其好处。@idz Sure-这就是为什么您需要一个策略来处理这些情况。但是使用浮动会在某个点上,在您最不期望的时候中断。当你使用货币时,每一分钱都很重要,浮动是不可接受的。(FWIW,NSDecimalNumber
非常轻量级;即使实时处理数千次计算,我也从未见过任何问题。)@ConradShultz-抱歉不得不扮演魔鬼代言人;-)
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 = ""
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
}
priceLabel.text = currencyFormatter.string(for: Decimal(9.48))
$9.48