You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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) → .99
  • formatDoubleAsStringFraction(number: 000.99) → .99
  • formatDoubleAsStringFraction(number: 1.99) → 1.99
  • formatDoubleAsStringFraction(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:15:09