2017-05-08 10 views
0

unitOptionsには.naturalScale、メトリック出力にはカナダへのロケールを使用して、MeasurementFormatterオブジェクトを設定しています。何らかの理由で、文字列を生成するときにセンチメートルを完全にスキップしています。MeasurementFormatter naturalScaleのセンチメートルの表示がありません

import UIKit 

let formatter = MeasurementFormatter() 
formatter.locale = Locale(identifier: "EN_CA") 
formatter.unitOptions = .naturalScale 

formatter.string(from: Measurement(value: 2, unit: UnitLength.centimeters)) 

ここで出力が"0.02 m"いうより期待"2 cm"次のとおりです。ここで

あなたは遊び場に貼り付けることができるコードです。

他の例:

formatter.string(from: Measurement(value: 0.2, unit: UnitLength.centimeters)) 
formatter.string(from: Measurement(value: 0.1, unit: UnitLength.centimeters)) 

これは完全にCMをスキップし、"0.002 m"、次いで"1 mm"を出力します。

センチメーターをスキップする理由は何ですか?ロケールとは何か関係がありますか?それは別のものですか?ちょうどバグですか?

ありがとうございます!

+0

何の出力を得て、何を期待していますか? –

+0

上記の出力は「0.02m」です。 "2cm"だけを出力することを期待してください。質問を編集して更新するつもりです。 – Mathieson

+0

試してみてください 'formatter.unitOptions = .providedUnit' –

答えて

1

これを行う方法があります。ちょっと面倒ですが、うまくいきます。

struct DistanceCm { 

    init(_ distanceCm: Double) { 
     distance = distanceCm 
    } 

    let formatter = MeasurementFormatter() 

    var _distance: Double? 
    var distance: Double { 

     get { 
      return _distance! 
     } 

     set { 
      _distance = newValue 
      formatter.locale = Locale(identifier: "EN_CA") 

      if (newValue >= 1 && newValue < 100) { 
       formatter.unitOptions = .providedUnit 
      } else { 
       formatter.unitOptions = .naturalScale 
      } 
     } 
    } 


    func toString() -> String { 
     return formatter.string(from: Measurement(value: _distance!, unit: UnitLength.centimeters)) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let d1 = DistanceCm(0.1) 
    print("\(d1.toString())") 

    let d2 = DistanceCm(2.0) 
    print("\(d2.toString())") 

    let d3 = DistanceCm(200.0) 
    print("\(d3.toString())") 

    let d4 = DistanceCm(20000.0) 
    print("\(d4.toString())") 

    let d5 = DistanceCm(200000.0) 
    print("\(d5.toString())") 
} 

出力は次のとおりです。

1 mm 
2 cm 
2 m 
200 m 
2 km 

P.S.私は10^3の倍数ではないので、フォーマッタは 'cm'を無視すると思います。 SI単位は一般に1000の倍数で上下します。

+0

それは意味があると思います。面白い。その例をまとめる時間をとってくれてありがとう! – Mathieson

関連する問題