2017-07-06 70 views
1

我有我的這個應用程序,其中一個文本字段必須像計算器顯示那樣行事。此文本字段顯示的數字是通過函數計算的。例如,如果數字是「3.21」,則應該像這樣顯示,並保留2位小數。如果數字有更多小數位數,則應該顯示它的小數位數。使用NSNumberFormatter格式化一個字符串

該文本框允許顯示10位數字。

如果數字大於9999999999(10個9),應以科學記數法顯示,如「4.767 E20」或類似的東西。

我想我必須使用NSNumberFormatter這個事情,但我看到我會有一系列的ifs和NSNumberFormatter s的複雜序列來完成這項工作,特別是小數位數。

我的問題是:這是要走的路或有某種NSNumberFormatter可以自動做到這一點?

+0

你用'NSNumberFormatterScientificStyle'檢查過嗎? – Tiko

回答

2

根本不需要使用數字格式化程序。您可以使用Swift或Objective-C中的%g格式字符串。雨燕的代碼應該是這樣的:

import UIKit 
var value = 0.0 
for digits in 1...12 { 
    value = value * 10 + 9 
    print(String(format:"%.10g", value)) 
} 

那得到的結果:

9 
99 
999 
9999 
99999 
999999 
9999999 
99999999 
999999999 
9999999999 
1e+11 
1e+12 

在Objective-C,你會使用NSStringstringWithFormat方法,並且還使用格式字符串@」 %0.10克」

我的Objective-C是生鏽,但代碼會是這個樣子:

double value = 0; 
for (int x = 0; x < 12; x++) { 
    value = value * 10 + 9; 
    NSString *result = [NSString stringWithFormat: @"%.10g", value]; 
    NSLog(@"value = %@", result); 
} 
+0

這幾乎運作良好,但是當我用11位數字添加一個數字時,它會產生「inf」。在我的情況下,我的變量是長雙倍,Xcode強迫我使用'%.10Lg' – SpaceDog

+0

您是否在32位設備上運行?當我在遊樂場(運行於x86 64)中運行該代碼時,我可以用科學記數法顯示幾乎任意數量的Double值。將循環更改爲15,甚至25,工作得很好。我還沒有嘗試在iOS設備上運行代碼,但它也應該在那裏工作得很好(至少對於64位設備) –

+0

哦,您正在使用Objective-C嗎? (long double在Swift中不是有效的類型。) –