2016-03-26 6 views
1

私は数値を入力するNSTableViewを持っています。これらは通常、「1」や「15」のように普通に表示できる数字です。しかし、それらのサブセットは常に "1.5E8"のように非常に大きくても小さくてもかまいません。NSNumberFormatterは大きい値または小さい値の "E"のみを表示しますか?

私はので、私はこれらをフォーマットするstringFromNumberを使用することができNSNumberFormatterシングルトンを作ったが、私が唯一のオンまたはオフにEを持つことができるようだ:

enter image description here

これらの「0E0」さんは役に立たない、彼らは単に "0"にする必要があります。この場合でもと思われません。私は何かを逃していますか?

または、コードでこれを行う必要がありますか?ここで

は私の文書のサブクラスでセットアップコードです:

var measurementFormatter: NSNumberFormatter = NSNumberFormatter() 
measurementFormatter.locale = NSLocale.currentLocale() 
measurementFormatter.numberStyle = .ScientificStyle 
measurementFormatter.alwaysShowsDecimalSeparator = true 
measurementFormatter.minimumFractionDigits = 0 
measurementFormatter.maximumFractionDigits = 6 
measurementFormatter.generatesDecimalNumbers = false 

と使用例:

numStr = (document?.measurementFormatter.stringFromNumber(num)! 
+0

私は 'NSNumberFormatter'から' E0E'をやったことがなかったです。今使用しているコードを実行する必要がありますか? – Sulthan

+0

良い点が追加されました。 –

+0

ここでiOSやOS Xについてお話していますか? OS Xのフォーマッタははるかに強力です(フォーマットには 'format'プロパティがありますので、任意のフォーマットを設定できます)。 iOSでは、最良の解決策は、結果から 'E0'サフィックスを削除するか、値に応じて2つのフォーマッタを使用することです。 – Sulthan

答えて

1

私はNSNumberFormatter専門家であると主張していない - あまりにも多くのオプションがにあります覚えている。しかしzeroSymbolを設定すると、あなたの問題を解決するようだ:

measurementFormatter.zeroSymbol = "0" 

編集:私がこの今夜の上にあまりにも多くの時間を費やしてきました。これは、等がこれらのE0を取り除くする方法は思わないので、私が代わりにNSNumberFormatterをサブクラス化することを決定した:

class MyNumberFormatter: NSNumberFormatter { 
    override func stringFromNumber(number: NSNumber) -> String? { 
     guard let str = super.stringFromNumber(number) else { 
      return nil 
     } 
     return str.stringByReplacingOccurrencesOfString("E0", withString: "", options: [.AnchoredSearch, .BackwardsSearch], range: str.startIndex..<str.endIndex) 
    } 
} 

var measurementFormatter = MyNumberFormatter() 
measurementFormatter.locale = NSLocale.currentLocale() 
measurementFormatter.numberStyle = .ScientificStyle 
measurementFormatter.alwaysShowsDecimalSeparator = true 
measurementFormatter.minimumFractionDigits = 0 
measurementFormatter.maximumFractionDigits = 6 
measurementFormatter.generatesDecimalNumbers = false 

// Examples: 
[0, 0.0014, 2, 15, 3.14, 100, 1500000000].forEach { 
    print("\($0) --> \(measurementFormatter.stringFromNumber($0)!)") 
} 

出力:

0 --> 0 
0.0014 --> 1.4E-3 
2 --> 2 
15 --> 1.5E1 
3.14 --> 3.14 
100 --> 1E2 
1500000000 --> 1.5E9 
+0

それはゼロのためにそれを解決しますが、例えば "1E0"として出てくる "1"ではありません。 –

+0

'format .'オプションは'#。###### E0; 1E-100;#。###### E0'です。ゼロフォーマットを置き換えることができます: '#。#### ## E0; 0;#。###### E0'となり、同じ結果が得られます。ゼロはそれ自体のフォーマットを持っているので簡単なケースです。 – Sulthan

+0

最後に、NSNumberFormatterをサブクラス化して、それらのE0を取り除くことにしました。 –

関連する問題