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

Mat*_*Car 8 uitextfield ios swift

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

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

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

我用这个读了这个值:

var importo = (importoPrevistoTF.text as NSString).floatValue
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 18

斯威夫特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
    }
}
Run Code Online (Sandbox Code Playgroud)
"2.25".doubleValue // 2.25
"2,25".doubleValue // 2.25
Run Code Online (Sandbox Code Playgroud)

使用NumberFormatter的本地化方法:

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

游乐场测试

// 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
Run Code Online (Sandbox Code Playgroud)


zap*_*aph 13

SO的潜在重复答案,使用NSNumberFormatter

示例Swift:

let number = NSNumberFormatter().numberFromString(numberString)
if let number = number {
    let floatValue = Float(number)
}
Run Code Online (Sandbox Code Playgroud)

示例(目标-C):

NSNumber *number = [[NSNumberFormatter new] numberFromString: numberString];
float floatValue = number.floatValue;
Run Code Online (Sandbox Code Playgroud)


Dun*_*n C 12

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

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

iOS支持基于特定区域设置格式化数字.

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

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

如果你在美国,你会使用一段时间.在美国使用逗号是错误的.

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

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

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


aya*_*aio 5

它可能是这个答案的重复,但由于原始是用 Objective-C 编写的,所以这里有一个 Swift 版本:

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

  • 问题是“formatter.numberFromString(label)”可能会返回“nil”,如果语言环境与字符串格式不匹配,它将返回 nil。 (2认同)