代码之家  ›  专栏  ›  技术社区  ›  Dmitry Serov

货币数字格式-数字为整数时省略分数部分

  •  2
  • Dmitry Serov  · 技术社区  · 8 年前

    我需要用于输出货币的数字格式的特定行为:

    • 如果数字是整数(0,0.00),则不应显示十进制分隔符(0‑0)
    • 否则(123.90,12.1),应在十进制分隔符(123.90,12.10)后显示两位数字。

    我现在创建和使用格式化程序的方式如下:

    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.currencySymbol = "€"
    formatter.alwaysShowsDecimalSeparator = false
    let num = formatter.string(from: 123.9)!
    

    如果这样创建,格式化程序总是显示十进制分隔符,尽管我将此属性设置为false。

    我怎样才能做到这一点?

    1 回复  |  直到 8 年前
        1
  •  0
  •   brianLikeApple    8 年前

    通货 numberStyle 总是在两位数后返回小数点。因此,如果要实现目标,应该自己修改输出字符串。

    请检查示例代码:

        let number1: Double = 123.908392857
        let number2: Int = 123
        let number3: Float = 123.00
    
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.currencySymbol = "€"
        let num1 = formatter.string(from: NSNumber(value: number1))! // Output €123.91
        let num2 = formatter.string(from: NSNumber(value: number2))! // Output €123.00
        let num3 = formatter.string(from: NSNumber(value: number3))! // Output €123.00
    
        print("\(num1) \(num2) \(num3)")
    
        // This is trick
        let newNum1 = trimString(string: num1) // Output €123.91
        let newNum2 = trimString(string: num2) // Output €123
        let newNum3 = trimString(string: num3) // Output €123
    
        print("\(newNum1) \(newNum2) \(newNum3)")
    

    trimString 是一个简单的微调功能,你可以把它放在 String extension 或者任何你想要的地方。

    func trimString(string: String) -> String {
        if string.hasSuffix(".00") {
            return String(string.dropLast(3))
        }
        else {
            return string
        }
    }
    

    你可能会问为什么 alwaysShowsDecimalSeparator 那就不行了?它是为 .decimal 数字样式 和默认值 decimalSeparator 为“”