将UITextField格式化为价格(XXX,XXX.XX)

时间:2011-09-08 20:56:11

标签: iphone uitextfield string-formatting nsnumber nsnumberformatter

我一直在试图找到解决方案。

我只是想让UITextField正确格式化输入的数字作为价格。这意味着只允许一个小数点,点后的两个数字(如果输入)和','分隔大数字(例如150,000)。

这就是价格格式正确的方式,为什么要做到这么难?

我最接近解决方案的是this code。然而,它的问题是在键入四位数后它恢复为0?这接近一个解决方案,我只是无法理解为什么会出现这种奇怪的行为。

2 个答案:

答案 0 :(得分:1)

您实际上不需要任何代码。只需在nib文件中的文本字段上拖动一个数字格式化程序,并将其配置为使用“货币”样式。

通过代码,这将是[myNumberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]

请注意,根据区域设置,价格格式会有很大差异。例如,在德国,点用作千位分隔符,逗号用作小数点。使用样式而不是固定格式可以为您解决这些差异。

答案 1 :(得分:1)

嗨这是我的解决方案。

template <typename ... Ts>
std::tuple<Ts...>& as_tuple(std::tuple<Ts...>& tuple) { return tuple; }

std::tuple<int&, float&> as_tuple(foo& f) { return std::tie(f.x, f.y); }

ViewController代码

import UIKit


extension Numeric {   // for Swift 3 use FloatingPoint or Int

    func currency(locale: String, symbol: Bool = true) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = Locale(identifier: locale)
        if !symbol {
            formatter.currencySymbol = ""
        }
        let result = formatter.string(for: self) ?? ""

        return result
    }

}

<强> viewDidLoad中

var price: String!
var priceNumber: CGFloat!
@IBOutlet weak var priceInput: UITextField!

ViewController中的UITextFieldDelegate

priceInput.addTarget(self, action: #selector(priceInputChanged), for: .editingChanged)
priceInput.tintColor = .clear

priceInput.delegate = self

那是