2016-04-15 91 views
2

我希望我的Double显示为Int,如果值为整数 - 否则为Double。打印Double as Int - 如果不是Double值

示例;

var Value = Double() 

Value = 25.0/10.0 

现在我想Value显示2.5(当插入标签)

Value = 20.0/10.0

现在我想Value显示2 - 而不是2.0

回答

3

一个经典的方法是建立一个epsilon的值,它代表了你考虑一个足够接近Int的值的容忍度:

// How close is close enough to be considered an Int? 
let kEPSILON = 0.0001 

var val = 1.9999 
var str: String 

if abs(val - round(val)) < kEPSILON { 
    str = String(Int(round(val))) 
} else { 
    str = String(val) 
} 

print(str) // "2" 
+0

我只会遇到两种不同的情况:'val'是一个Int或'val = 2.5' - 我应该使用'kEPSILON = 0.1'吗? :-) –

+0

在你的情况下,'0.1'可以工作。使用'0.0001'也没有什么坏处。 – vacawama

+0

@RappeStegarn如果val不是int的唯一情况是2.5,那么你可以检查它是否为2.5,如果不是,则将其转换为int。即Int(val) – LulzCow

4

一种方法是使用%运营商获得的小数部分,并检查是否是零:

let stringVal = (Value % 1 == 0) 
? String(format: "%.0f", Value) 
: String(Value) 
2

要将数字显示为文本,请使用NSNumberFormatter()。您可以设置其minimumFractionDigits 属性设置为零:

let fmt = NSNumberFormatter() 
fmt.minimumIntegerDigits = 1 
fmt.maximumFractionDigits = 4 
fmt.minimumFractionDigits = 0 

print(fmt.stringFromNumber(25.0/10.0)!) // 2,5 
print(fmt.stringFromNumber(20.0/10.0)!) // 2 
print(fmt.stringFromNumber(2.0/7.0)!) // 0,2857 

如果你想有一个小数期间,独立于用户的语言环境, 再加入

fmt.locale = NSLocale(localeIdentifier: "en_US_POSIX") 

斯威夫特3:

let fmt = NumberFormatter() 
// Optional: 
fmt.locale = Locale(identifier: "en_US_POSIX") 

fmt.minimumIntegerDigits = 1 
fmt.maximumFractionDigits = 4 
fmt.minimumFractionDigits = 0 

print(fmt.string(from: 25.0/10.0 as NSNumber)!) // 2,5 
print(fmt.string(from: 20.0/10.0 as NSNumber)!) // 2 
print(fmt.string(from: 2.0/7.0 as NSNumber)!) // 0,2857 
2

我喜欢dasblinkenlight's an d vacawama的答案,但也想参与另一个问题:使用NSNumberFormatter

let formatter = NSNumberFormatter() 
formatter.numberStyle = .DecimalStyle 
formatter.alwaysShowsDecimalSeparator = false 

let string0 = formatter.stringFromNumber(25.0/10.0)! 
let string1 = formatter.stringFromNumber(20.0/10.0)! 

print(string0) 
print(string1) 

结果:

2.5 
2 

最重要的优势:它是本地化。在德国设备上,它将显示2.5而不是2.5,就像德语用户所期望的那样。