Swift中如何让NumberFormatter支持分数转小数?
解决NumberFormatter解析分数并转为十进制的问题
原生的NumberFormatter并不支持直接解析1/3这类分数格式的输入字符串,要实现你想要的效果,需要先手动拆分分数字符串计算出十进制数值,再用你的格式化器处理输出结果。
实现步骤
- 编写一个辅助函数,用于将分数字符串(如
2/3)转换为十进制数值 - 结合你已有的
NumberFormatter实例,对计算出的数值进行格式化,得到指定小数位数的结果
代码示例
首先是处理分数字符串的辅助函数:
func decimalValue(fromFractionString string: String) -> Double? { let components = string.split(separator: "/") // 处理非分数格式的情况(如纯整数) guard components.count == 2 else { return Double(string) } // 解析分子分母并计算,避免分母为0 guard let numerator = Double(components[0]), let denominator = Double(components[1]), denominator != 0 else { return nil } return numerator / denominator }
然后调整你的NumberFormatter(添加 roundingMode 确保符合预期的取整效果),并结合使用:
// 你的格式化器(添加roundingMode以匹配预期的四舍五入规则) let formatter: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.maximumFractionDigits = 8 formatter.roundingMode = .halfUp // 确保超过8位小数时向上取整,符合2/3→0.66666667的预期 return formatter }() // 测试示例 if let value = decimalValue(fromFractionString: "2/3"), let formattedResult = formatter.string(from: NSNumber(value: value)) { print(formattedResult) // 输出:0.66666667 } if let value = decimalValue(fromFractionString: "1/10"), let formattedResult = formatter.string(from: NSNumber(value: value)) { print(formattedResult) // 输出:0.1 } if let value = decimalValue(fromFractionString: "5/115"), let formattedResult = formatter.string(from: NSNumber(value: value)) { print(formattedResult) // 输出:0.04347826 }
关键说明
NumberFormatter本身没有解析分数的能力,必须通过自定义逻辑拆分分子分母计算数值- 设置
roundingMode = .halfUp是为了保证小数部分第9位≥5时向上进一位,完全匹配你预期的2/3输出0.66666667 - 辅助函数兼容了非分数格式的输入(如纯整数),同时处理了分母为0的异常情况
内容的提问来源于stack exchange,提问作者Exynos
相关产品推荐
相关产品推荐

