Swift中使用NumberFormatter移除Double小数点前数字无效问题
问题解答
这是完全正常的现象。
原因解释
minimumIntegerDigits 属性的作用是指定数字格式化后整数部分的最小显示位数:
- 当设置为0时,仅允许整数部分为0的数字省略掉前面的0,直接输出小数部分(比如0.99、000.99这类情况);
- 但如果整数部分是非0的有效数值(比如1.99、123.99),该属性不会强制移除这些整数位——它只负责定义“最少要显示几位整数”,而非“删除所有整数位”。
实现需求的解决方案
如果你想实现「仅当整数部分为0时移除小数点前的0,非0时保留整数部分」的效果,可以通过判断数字的整数部分动态调整格式化规则,示例代码如下:
func formatDoubleAsStringFraction(number: Double)->String{ let num = NSNumber(value: number) let formatter = NumberFormatter() formatter.locale = NSLocale.current formatter.minimumFractionDigits = 2 formatter.numberStyle = .decimal // 根据整数部分是否为0调整最小整数位设置 if num.intValue == 0 && number != 0 { formatter.minimumIntegerDigits = 0 } else { formatter.minimumIntegerDigits = 1 } return formatter.string(for: number)! }
测试结果:
formatDoubleAsStringFraction(number: 0.99)→.99formatDoubleAsStringFraction(number: 000.99)→.99formatDoubleAsStringFraction(number: 1.99)→1.99formatDoubleAsStringFraction(number: 123.99)→123.99
另外,也可以先统一格式化后再处理字符串(适配本地化小数点符号):
func formatDoubleAsStringFraction(number: Double)->String{ let formatter = NumberFormatter() formatter.locale = NSLocale.current formatter.minimumFractionDigits = 2 formatter.minimumIntegerDigits = 1 formatter.numberStyle = .decimal guard let formattedStr = formatter.string(for: number) else { return "" } let decimalSeparator = formatter.decimalSeparator ?? "." let prefixToRemove = "0\(decimalSeparator)" return formattedStr.starts(with: prefixToRemove) ? String(formattedStr.dropFirst()) : formattedStr }
内容的提问来源于stack exchange,提问作者fs_tigre
相关产品推荐
相关产品推荐

