如何将NSNumberFormatter处理的格式化数据传递到另一个ViewController?
解决数值格式化后跨控制器传递显示的问题
首先得明确核心问题:你现在传递的是Double类型的原始数值,它本身不携带任何格式化或本地化的信息——就像一个纯数字,没有逗号、小数点位数这些格式标记,所以到目标控制器后直接显示肯定是原始的样子。下面给你两种可行的解决方案,按需选择:
方案一:直接传递已经格式化好的字符串(最简单,适合仅需显示的场景)
既然你在源控制器里已经用NumberFormatter生成了符合要求的格式化字符串(就是mounthLabel.text),那直接把这个字符串传递过去就好,不用重复做格式化逻辑:
- 修改源控制器的
prepare(for:sender:)方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "yearmounth" { let mounthController = segue.destination as! MounthsViewController // 传递已经格式化完成的文本,用空字符串做默认值避免nil问题 mounthController.formattedMonthText = mounthLabel.text ?? "" } }
- 在目标控制器
MounthsViewController中添加对应属性,并在viewDidLoad里赋值给Label:
// 新增存储格式化文本的属性 var formattedMonthText: String = "" override func viewDidLoad() { super.viewDidLoad() // 直接把格式化好的文本赋值给目标Label yourTargetMonthLabel.text = formattedMonthText }
方案二:传递原始数值,在目标控制器重新格式化(推荐,适合需要后续计算的场景)
如果目标控制器还需要用这个数值做其他运算,那保留原始Double值会更灵活。你之前说在目标控制器加格式化器没生效,大概率是代码细节出错了,比如Formatter配置不对、Label没有正确关联IBOutlet,或者拼写错误(比如你代码里的mounth是不是应该是month?)。正确的做法是:
- 源控制器的
prepare方法保持原样,传递原始数值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "yearmounth" { let mounthController = segue.destination as! MounthsViewController mounthController.monthValue = mounthresult } }
- 目标控制器中正确配置Formatter并格式化显示:
// 存储原始数值的属性 var monthValue: Double = 0.0 override func viewDidLoad() { super.viewDidLoad() // 配置和源控制器完全一致的NumberFormatter let formatter = NumberFormatter() formatter.locale = Locale.current formatter.numberStyle = .decimal formatter.minimumSignificantDigits = 6 // 将数值转换为格式化后的字符串并赋值给Label if let formattedText = formatter.string(from: NSNumber(value: monthValue)) { yourTargetMonthLabel.text = formattedText } }
为什么你之前的尝试没生效?
你用mounthresult = formatter.number(from: mounthLabel.text!) as! Double的操作,其实是把已经格式化好的字符串又转回了原始的Double值——相当于把带格式的数字打回原形,传递的还是不带任何格式信息的纯数值,所以显示的时候自然没有格式和本地化效果。
内容的提问来源于stack exchange,提问作者Ivan Kisin
相关产品推荐
相关产品推荐

