UITextField的数字键:浮点值的点而不是逗号

时间:2015-05-10 11:26:43

标签: ios swift uitextfield

我正在使用从数字键盘填充的textField。

麻烦的是,有很多本地区域格式(例如所有欧洲格式),UITextField的数字键盘用逗号代替点,所以每当我写一个十进制数字时,UITextField就无法识别十进制逗号和它的整数;例如23,07变为23。

我该如何解决这个问题? 我想把textField设置在USA上;可能吗?怎么样?

我用这个读取了值:

var importo = (importoPrevistoTF.text as NSString).floatValue

11 个答案:

答案 0 :(得分:17)

Swift 4

extension String {
    static let numberFormatter = NumberFormatter()
    var doubleValue: Double {
        String.numberFormatter.decimalSeparator = "."
        if let result =  String.numberFormatter.number(from: self) {
            return result.doubleValue
        } else {
            String.numberFormatter.decimalSeparator = ","
            if let result = String.numberFormatter.number(from: self) {
                return result.doubleValue
            }
        }
        return 0
    }
}
"2.25".doubleValue // 2.25
"2,25".doubleValue // 2.25

使用NumberFormatter的本地化方法:

extension NumberFormatter {
    static let shared = NumberFormatter()
}
extension StringProtocol {
    var doubleValue: Double? {
        return NumberFormatter.shared.number(from: String(self))?.doubleValue
    }
}

游乐场测试

// User device's default settings for current locale (en_US)
NumberFormatter.shared.locale            // en_US (current)
NumberFormatter.shared.numberStyle       // none
NumberFormatter.shared.decimalSeparator  // "."
"2.7".doubleValue  // 2.7
"2,7".doubleValue  // nil
"$2.70".doubleValue  // nil

NumberFormatter.shared.numberStyle  = .currency
"2.7".doubleValue  // nil
"2,7".doubleValue  // nil
"$2.70".doubleValue  // 2.7


NumberFormatter.shared.locale  = Locale(identifier: "pt_BR") // pt_BR (fixed)
"2.7".doubleValue     // nil
"2,7".doubleValue     // nil
"R$2,70".doubleValue  // 2.7

NumberFormatter.shared.numberStyle = .none
"2.7".doubleValue      // nil
"2,7".doubleValue      // 2.7
"R$2,70".doubleValue   // nil

答案 1 :(得分:13)

SO Answer的潜在副本,请使用NSNumberFormatter

示例Swift:

let number = NSNumberFormatter().numberFromString(numberString)
if let number = number {
    let floatValue = Float(number)
}

示例(目标-C):

NSNumber *number = [[NSNumberFormatter new] numberFromString: numberString];
float floatValue = number.floatValue;

答案 2 :(得分:10)

没有人真正直接解决这个问题。

也就是说,小数分隔符是区域设置的约定。

iOS支持根据特定区域设置格式化数字。

如果你纯粹在给定的语言环境中工作,那么一切都应该正常工作。键盘应接受带有正确小数分隔符的数字。

例如,如果您在欧洲的大部分国家/地区,请输入逗号作为小数点分隔符。在这些国家/地区输入一个点是错误的。来自其中一个国家的人不会这样做,因为它是错误的小数分隔符。欧洲用户将会知道使用逗号作为小数分隔符,您不必做任何事情。

如果您在美国,则使用一段时间。在美国使用逗号是错误的。

显示十进制数字的方式是使用数字格式化程序。创建数字格式化程序时,它默认使用当前语言环境。

如果需要将包含十进制数的字符串从一个语言环境转换为另一个语言环境,则应使用2个数字格式器。在源语言环境中使用格式化程序将字符串转换为float。然后使用具有目标语言环境的格式化程序将数字转换为输出格式的字符串。

只需在默认的当前语言环境中创建一个数字格式化程序,然后创建第二个数字格式化程序并将其明确设置为您要使用的其他语言环境。

答案 3 :(得分:4)

它可能是this answer的副本,但由于原文是在Objective-C中,所以这是一个Swift版本:

let label = "23,07"
let formatter = NSNumberFormatter()
let maybeNumber = formatter.numberFromString(label)
if let number = maybeNumber {
    println(number)   // 23.07
}

答案 4 :(得分:1)

由于最近版本的Swift中的NumberFormatter取代了NSNumberFormatter,我很乐意与您分享升级后的可能解决方案:

var numberFormatter: NumberFormatter()
importo = Float(numberFormatter.number(from: importoPrevistoTF.text!)!)

答案 5 :(得分:1)

Swift 3:包含带逗号浮点的字符串的float或double值

extension String {
    var floatValue: Float {
        let nf = NumberFormatter()
        nf.decimalSeparator = "."
        if let result = nf.number(from: self) {
            return result.floatValue
        } else {
            nf.decimalSeparator = ","
            if let result = nf.number(from: self) {
                return result.floatValue
            }
        }
        return 0
    }

    var doubleValue:Double {
        let nf = NumberFormatter()
        nf.decimalSeparator = "."
        if let result = nf.number(from: self) {
            return result.doubleValue
        } else {
            nf.decimalSeparator = ","
            if let result = nf.number(from: self) {
                return result.doubleValue
            }
        }
        return 0
    }
}

示例:

"5,456".floatValue //5.456
"5.456".floatValue //5.456
"5,456".doubleValue //5.456
"5.456".doubleValue //5.456

"5,456".doubleValue.rounded() //5
"5,6".doubleValue.rounded() //6

答案 6 :(得分:1)

我找到的解决方案:

let nf = NumberFormatter()
nf.locale = Locale.current
let numberLocalized = nf.number(from: txtAlcool.text!)

在我的情况下,我正在测试xcode,一切顺利,但在设备上测试时它崩溃了。所有这些都是因为在巴西我们使用公制,逗号分隔十进制","。使用此解决方案,它会自动从逗号转换为点。

答案 7 :(得分:0)

Swift 4解决方案,不使用preferredLanguages我遇到了fr_US和decimalPad

的问题
extension String {

     func number(style: NumberFormatter.Style = .decimal) -> NSNumber? {
        return [[Locale.current], Locale.preferredLanguages.map { Locale(identifier: $0) }]
            .flatMap { $0 }
            .map { locale -> NSNumber? in
                let formatter = NumberFormatter()
                formatter.numberStyle = style
                formatter.locale = locale
                return formatter.number(from: self)
        }.filter { $0 != nil }
        .map { $0! }
        .first
    }
}

textfield.text?.number()?.floatValue

答案 8 :(得分:0)

您可以使用NumberFormatter转换它并过滤不同的小数分隔符:

func getDoubleFromLocalNumber(input: String) -> Double {
    var value = 0.0
    let numberFormatter = NumberFormatter()
    let decimalFiltered = input.replacingOccurrences(of: "٫|,", with: ".", options: .regularExpression)
    numberFormatter.locale = Locale(identifier: "EN")
    if let amountValue = numberFormatter.number(from: decimalFiltered) {
        value = amountValue.doubleValue
    }
    return value
}

答案 9 :(得分:0)

使用当前版本的Swift的代码:

let amount = "8,35"

var counter: Int = 0
var noCommaNumber: String!
for var carattere in (amount) {
    if carattere == "," { carattere = "." }
    if counter != 0 { noCommaNumber = "\(noCommaNumber ?? "\(carattere)")" + "\(carattere)" } else { noCommaNumber = "\(carattere)" } // otherwise first record will always be nil
    counter += 1
}

let importo = Float(noCommaNumber)

答案 10 :(得分:-1)

        let number                      =   NSNumberFormatter()
        let locale                      =   NSLocale.currentLocale()
        let decimalCode                 =   locale.objectForKey(NSLocaleDecimalSeparator) as! NSString

        number.decimalSeparator = decimalCode as String
        let result = number.numberFromString(textField.text!)

        let value = NSNumberFormatter.localizedStringFromNumber(result!.floatValue, numberStyle: .DecimalStyle)
        print(value)

希望,这可以帮助你:)