为何NSNumber转回字符串时不遵循区域设置的decimalSeparator?
解决NumberFormatter双向转换时区域格式不一致的问题
这种情况我碰到过好多次,大概率是你在把NSNumber转回字符串的时候,要么没复用之前配置好的NumberFormatter实例,要么重新创建的formatter没正确继承当前的区域设置(瑞典的小数分隔符是,)。
核心解决方案:复用同一个配置完整的NumberFormatter
关键在于用同一个NumberFormatter完成字符串→NSNumber→字符串的双向转换,因为它会保留你设置的区域、格式样式等所有配置。
举个完整的代码示例(Swift):
// 初始化并配置符合当前区域的NumberFormatter let numberFormatter = NumberFormatter() numberFormatter.locale = Locale.current // 瑞典环境下自动识别为sv_SE,小数分隔符为"," numberFormatter.numberStyle = .decimal // 根据你的业务需求选择合适的样式,比如decimal、currency等 // 第一步:字符串转NSNumber let inputString = "123,45" if let convertedNumber = numberFormatter.number(from: inputString) { print("转换得到的NSNumber: \(convertedNumber)") // 第二步:用同一个formatter把NSNumber转回字符串 if let convertedBackString = numberFormatter.string(from: convertedNumber) { print("转回后的字符串: \(convertedBackString)") // 瑞典区域下会输出"123,45" } }
常见误区避坑
- 不要重新创建formatter:如果转回时新建一个
NumberFormatter却没手动设置locale,它可能会使用系统默认的区域(或者和你之前用的不一致),导致分隔符错误。 - 明确指定区域(可选):如果你想强制使用瑞典区域,不管系统当前设置是什么,可以直接指定locale:
numberFormatter.locale = Locale(identifier: "sv_SE") - 确认numberStyle匹配:确保
numberStyle设置正确,比如你用.decimal处理小数,就不要在转回时改成其他样式,否则格式会不符合预期。
内容的提问来源于stack exchange,提问作者Oleg Gordiichuk
相关产品推荐
相关产品推荐

