无论小数点后的位数如何,如何快速显示 2 位小数?

Posted

技术标签:

【中文标题】无论小数点后的位数如何,如何快速显示 2 位小数?【英文标题】:how to show 2 decimal places regardless of the number of digits after decimal in swift? 【发布时间】:2015-04-01 15:50:01 【问题描述】:

我正在swift 中编写一个应用程序,并使用了以下代码。所以我的输出按预期四舍五入到小数点后两位。

这运作良好。但是,如果结果小于 2 位小数,则仅显示 1 位。这是最基本的示例,但我的结果可能是整数或小数点后 10 位。我希望他们都显示为 .xx

1.2345 => 1.23

1.1 => 1.1

无论小数点后的位数如何,如何让结果始终显示 2 位小数?

例如: 1.1 => 1.10

我已经进行了广泛的搜索,但我没有找到答案。 这是我到目前为止尝试过的代码:

@IBOutlet var odds: UITextField!
@IBOutlet var oddsLabel: UILabel!
var enteredOdds = NSString(string: odds.text).doubleValue
var numberOfPlaces = 2.0
var multiplier = pow(10.0, numberOfPlaces)
var enteredOddsRounded = round(enteredOdds * multiplier) / multiplier          
oddsLabel.text = "\(enteredOddsRounded)"
println("\(enteredOddsRounded)")

感谢 cmets。我修改如下:

@IBOutlet var odds: UITextField!
@IBOutlet var oddsLabel: UILabel!
var enteredOdds = NSString(string: odds.text).doubleValue

let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle

for identifier in ["en_UK", "eu_US"] 
    formatter.locale = NSLocale(localeIdentifier: identifier)
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2


oddsLabel.text = formatter.stringFromNumber(enteredOdds)

它让我丢失了很多代码,因为它为我做四舍五入和小数位,同时还包括货币作为奖励。

虽然这适用于我确实需要显示货币的所有字段,但上述值“oddsLabel.text”实际上不是货币,因此只解决了四舍五入和小数位。

我如何修改上述内容,以便考虑使用和/或不使用货币的字段。希望无需再次重新复制代码?

再次感谢所有快速回复。

弗兰克

【问题讨论】:

为每个字段创建一个新的格式化程序实例。你不必复制,只需为常见的东西创建函数。 【参考方案1】:
let b = 2.1
println(String(format:"%.02f", b))

在我的操场上给出字符串“2.10”。

【讨论】:

【参考方案2】:

您使用的称为“幼稚”实现。它主要工作,但它有一些小问题和一些隐藏的问题。隐藏的问题之一是您完全忽略了用户区域设置 - 大多数欧洲语言使用逗号作为小数分隔符而不是点。

为了处理十进制数到字符串的转换问题(反之亦然),大多数编程语言都提供了专用的 API。在 Cocoa/CocoaTouch 中有NumberFormatter

例子:

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
oddsLabel.text = formatter.string(for: enteredOdds)

请注意,舍入已为您完成。

【讨论】:

感谢 Sulthan,我使用下面 John 的链接实现了一个版本,但包括货币区域设置。 很棒的解决方案【参考方案3】:

也许你正在寻找NSNumberFormatter

let nf = NSNumberFormatter()
nf.minimumFractionDigits = 2
nf.stringFromNumber(enteredOddsRounded)

【讨论】:

【参考方案4】:

设置最小小数位数的扩展:

   extension String 
        func setMinTailingDigits() -> String 
            let formatter = NumberFormatter()
            formatter.minimumFractionDigits = 2
            return formatter.string(from: Double(self)! as NSNumber)!
        
    

【讨论】:

【参考方案5】:
oddsLabel.text = (NSString(format:"%.2f", enteredOddsRounded))

这是我在某些情况下使用的

还有一个使用 NSNumberFormatter 的选项,您也可以在其中添加逗号

这里有教程 http://nshipster.com/nsformatter/

【讨论】:

感谢 John,我使用该链接找到了类似于 Sulthans 的零件解决方案。虽然现在我需要弄清楚如何识别输出应该是货币还是现在。

以上是关于无论小数点后的位数如何,如何快速显示 2 位小数?的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何控制小数位数

如何快速提取Excel小数点后第N位数字

matlab如何设置小数点后位数?

小数点前面百位数进行四舍五入如何编程汉语编程巧妙处理

【mfc】如何设置与Edit控件关联的double变量所显示的小数位数

C语言中输出时怎样控制小数点后的位数,请举例说明保留1、2、3、4位小数等等,谢谢