当UITextField在Swift中具有货币值时,如何使用numberFromString

时间:2015-04-14 23:46:04

标签: ios swift xcode6

我有一笔'金额'输入字段,它取一个数字值,我希望在输入字段本身中显示为货币。我似乎没有任何问题。

然后我在计算中使用此值并输出为货币值。再次,这在第一次工作正常,因为它最初将其视为双重而非货币。

当我尝试重复使用'金额中的值时,我的问题就出现了。输入字段,因为货币符号等,正在看到该值并且不再是双倍。

有什么建议吗?

根据建议编辑如下:

    var formatter = NSNumberFormatter()
        formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        formatter.minimumFractionDigits = 2
        formatter.maximumFractionDigits = 2

    var numberOfPlaces = 2.0
    var multiplier = pow(10, numberOfPlaces)

    var enteredAmount = formatter.numberFromString(finalAmount.text)?.doubleValue ?? 0.0

   enteredAmountLabel.text = formatter.stringFromNumber(enteredAmount)

   finalAmount.text = formatter.stringFromNumber(enteredAmount)

使用这些修正计算在第一次输入任何字段时起作用。如果在填充字段时尝试计算,则会将字段重置为$ 0.00

如果我修改为:

    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle

一切都按预期工作,但金额输入字段不再显示为货币。

我正在尝试提供屏幕截图,但我没有足够的声誉点。

1 个答案:

答案 0 :(得分:0)

这是给您带来麻烦的线吗?

var enteredAmount = NSNumberFormatter().numberFromString(finalAmount.text)!.doubleValue

看起来你有正确的想法。您可以使用数字格式器将值转换为格式化字符串以进行显示,或将格式化字符串转换为值。

我希望代码可以正常工作。

该行是否给出了编译错误?运行时出错?不给它应该的价值?

编辑:

@LeonardoSavioDabus指出了这个问题。该行应使用您在上面创建的数字格式化程序:

var enteredAmount = formatter.numberFromString(finalAmount.text)!.doubleValue

你真的不应该像这样使用力展开。您应该使用nil合并运算符:

var enteredAmount = formatter.numberFromString(finalAmount.text)?.doubleValue ?? 0.0

编辑#2:

在美国,此代码在游乐场中完美运行:

import Foundation

var formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2

let moneyString = "$12.93"

var enteredAmount = formatter.numberFromString(moneyString)?.doubleValue ?? 0.0

enteredAmount += 0.07

var newString = formatter.stringFromNumber(enteredAmount)

(我删除了所有的语言环境,使其变得更简单。)

编辑#3:

您的区域设置代码对我没有意义。

for identifier in ["en_US" , "en_UK" , "en_US","fr_FR"] {
    formatter.locale = NSLocale(localeIdentifier: identifier)
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
}//end of locale detection for currency and decimal formatting

该代码看起来像循环遍历3个identifier的不同值,并为您的格式化程序分配3个不同的区域设置,并且相同的最大/最小数字计数(均为2)。我读取该代码的方式是,首先分配美国本地,然后是英国本地,再分配美国英语,最后是法国法语。因此,在循环结束时,语言环境将设置为“fr_FR”。这可能不是你想要的。