2016-04-15 89 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,就像德語用戶所期望的那樣。