我正在尝试在swift中创建一个接收String并返回Bool的方法。如果String是正确的货币格式,我想返回true,如果不是,则返回false。
到目前为止,这是我尝试过的方法:
func textIsValidCurrencyFormat(text: String) -> Bool {
var isValidCurrencyFormat = false
var numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
var number = numberFormatter.numberFromString(text)
if number != nil {
isValidCurrencyFormat = true
}
return isValidCurrencyFormat
}
问题:除了我想要在金额之前或之后使用空格的字符串无效,并且如果此方法当前接受的小数之后有两个以上的数字时,这也有效。
目前我并不关心该方法是否基于货币类型(又名美元或英镑或其他货币)返回true或false,但我可能希望在将来使用此方法拒绝特定类型以外的货币
编辑:
这是我提出的最终代码,它正确地确定是否以正确的货币格式输入字符串并说明边缘情况。请在下面的评论中添加任何建议!
func textIsValidCurrencyFormat(text: String) -> Bool {
var isValidCurrencyFormat = false
var numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
var number = numberFormatter.numberFromString(text)
if number != nil {
let numberParts = text.componentsSeparatedByString(".")
if numberParts.count == 2 {
let decimalArray = Array(numberParts[1])
if decimalArray.count <= 2 {
if text == text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
isValidCurrencyFormat = true
}
}
} else {
if text == text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
isValidCurrencyFormat = true
}
}
}
return isValidCurrencyFormat
}
答案 0 :(得分:0)
这是怎么回事?如果精度大于美分,则返回false
:
if Double(number!) * 100 != floor(Double(number!) * 100) {
isValidCurrencyFormat = false
}
如果之前或之后有空格,请返回false
:
if text != text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
isValidCurrencyFormat = false
}
所以把它们放在一起:
func textIsValidCurrencyFormat(text: String) -> Bool {
var isValidCurrencyFormat = false
var numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
var number = numberFormatter.numberFromString(text)
if number != nil {
isValidCurrencyFormat = true
if Double(number!) * 100 != floor(Double(number!) * 100) {
isValidCurrencyFormat = false # or just return false here
}
}
if text != text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
isValidCurrencyFormat = false # or just return false here
}
return isValidCurrencyFormat
}
答案 1 :(得分:0)
我绝对采取另一种方法。我创建了一个正则表达式并将其与您的货币字符串匹配,如下所示:
func textIsValidCurrencyFormat(text: String) -> Bool {
if text =~ "^(\$?\d{1,3}(,?\d{3})?(\.\d\d?)?|\(\$?\d{1,3}(,?\d{3})?(\.\d\d?)?\))$" {
return true
}
return false
}
我认为正则表达式适用于美元,但我认为您可以修改它以使用您需要的任何货币。