Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在ios上正确设置货币格式_Iphone_Ios_Numbers_Currency_Formatter - Fatal编程技术网

Iphone 如何在ios上正确设置货币格式

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

我正在寻找一种不使用TextField hack将字符串格式化为货币的方法

例如,我想把数字“521242”转换成“5212.42” 或者如果我有一个低于1美元的数字,我希望它看起来像这样:“52”->“0.52”


谢谢

您可能想要这样的东西(假设货币是浮动的):

根据您将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