Finding the distance, currency, temperature units etc. for a country (iPhone)

前端 未结 5 844
灰色年华
灰色年华 2020-12-29 04:27

During the localization of my app I went through a lot of documentation, somewhere Im sure I read that there is a way to get a set of units that is linked with the locale.

相关标签:
5条回答
  • 2020-12-29 04:59

    You can use NSLocale to check the currency unit, but for imperial vs. metric you need to make a list yourself.

    Oops. You can check for the imperial vs. metric. There is are NSLocaleMeasurementSystem and NSLocaleUsesMetricSystem keys.

    0 讨论(0)
  • It is worth mentioning that Apple provides a nice library (MKDistanceFormatter, introduced in iOS 7) to automatically present a CLLocationDistance as the appropriate string for a given user's locale and language.

    It does a little fuzzy rounding (e.g. 300ft->350ft->400ft), but does nicely convert between units (e.g. feet -> miles, when appropriate to do so). Unless you demand really precise values, this class is perfect for returning rough estimates for distances in two lines of code.

    MKDistanceFormatter *distanceFormatter = [[MKDistanceFormatter alloc] init];
    [distanceFormatter setUnitStyle:MKDistanceFormatterUnitStyleAbbreviated]; // Optional
    NSString *formattedDistance = [distanceFormatter stringFromDistance:100];
    NSLog(@"%@",formattedDistance); // Prints "350 ft"
    

    https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKDistanceFormatter_class/Reference/Reference.html

    0 讨论(0)
  • I just wanted to note, that, as with the release of iOS8 there will be new NSFormatters for at least some of the units you mentioned.

    There will be NSLengthFormatter, NSMassFormatter and NSEnergyFormatter which are very easy to use – see this iOS8 NSFormatter tutorial. Here is an example using the NSLengthFormatter with swift:

    let lengthFormatter = NSLengthFormatter()
    println(@"Kilometer: %@", lengthFormatter.stringFromValue(1000, unit: .Kilometer))       //Kilometer: 1,000 km
    
    0 讨论(0)
  • 2020-12-29 05:16

    I have extracted this method to String extension. Looks elegant

    Swift 4.1 version

    import MapKit
    
    extension String {
        init(distance: Double ) {
            let mkDistanceFormatter = MKDistanceFormatter()
            mkDistanceFormatter.unitStyle = .abbreviated
            self = mkDistanceFormatter.string(fromDistance: distance)
        }
    }
    

    Usage

    let distance = Double(34234.0)
    let stringDistance String(distance:distance)
    
    0 讨论(0)
  • 2020-12-29 05:19

    Swift:

    1.)

    import MapKit
    

    2.) Since creating formatter is expensive, you better set formatter as a lazy property. By doing so, you can initialize the formatter only when it's necessary and reuse the formatter rather than create a new one.

    lazy var distanceFormatter: MKDistanceFormatter = {
        var tempDistanceFormatter =  MKDistanceFormatter()
        tempDistanceFormatter.unitStyle = .Abbreviated // .abbreviated in Swift 3
    
        return tempDistanceFormatter
    }()
    

    3.)

    let distanceString = self.distanceFormatter.stringFromDistance(yourDistance)
    
    0 讨论(0)
提交回复
热议问题