【问题标题】:Converting a string to double for coordinate use, Xcode将字符串转换为双精度以供坐标使用,Xcode
【发布时间】:2012-11-08 22:52:37
【问题描述】:

我有一个 XML 文件中的经度和纬度列表。我可以将 lat 和 lon 打印为字符串,但是当我将字符串转换为双精度时,我得到 0。

这是我的代码:

NSString *latstring = [[NSString alloc] initWithString:theList.lat] ;
NSString *lonstring = [[NSString alloc] initWithString:theList.lon];
NSLog(@"latstring: %@, lonstring: %@", latstring, lonstring);

double latdouble = [latstring doubleValue];
double londouble = [lonstring doubleValue];
NSLog(@"latdouble: %g, londouble: %g", latdouble, londouble);

当我记录 'latstring' 和 'lonstring' 时,我得到正确的坐标,但是当我记录 'latdouble' 和 'londouble' 时,我得到 0。

我需要 lat 和 lon 值作为双精度值,因此我可以在地图视图中使用它们,因为它不允许我使用字符串作为坐标。

对此可能有一个非常简单的解释,但是我对objective-c还很陌生,似乎无法找到解决方案。

非常感谢任何帮助。

【问题讨论】:

  • NSLog(@"latstring: %@, lonstring: %@", latstring, lonstring); 实际显示的是什么?
  • 控制台显示:2012-07-25 12:10:28.720 XMLTest2[4851:707] latstring: 55.035966, lonstring: -1.710799 2012-07-25 12:10:28.721 XMLTest2[4851: 707] latdouble: 0, londouble: 0
  • 转换格式肯定没问题。例如,NSLog(@"lat: %g, lon: %g", [@"55.035966" doubleValue], [@"-1.710799" doubleValue]); 工作正常(不包括舍入)。尝试在双重转换之前记录字符串的长度,以查看是否有任何不可打印的字符导致问题。
  • 当我记录长度时:NSLog(@"latstring length: %i, lonstring length: %i", latstring.length, lonstring.length);我得到:'latstring 长度:10,lonstring 长度:10'
  • 正确吗?我不知道是否应该有前导空格(应该可以)或其他一些额外的字符。

标签: objective-c string double coordinates


【解决方案1】:

解决了这个问题。像菲利普所说的那样计算字符串的长度后,结果发现长度比字符串长 1 个字符。所以我在中间添加了另一个字符串,它与'latstring'和'lonstring'相同,但是它从索引1而不是0开始,因此切断了必须在坐标值前面的任何字符。然后完美地转换为双倍。

这里是使用的代码:

NSString *latstring = theList.lat;
NSString *lonstring = theList.lon;
NSLog(@"%@, %@ wooo", latstring, lonstring);

NSString *latcutstring = [latstring substringFromIndex:1];
NSLog(@"cut lat: %@", latcutstring);
NSString *loncutstring = [lonstring substringFromIndex:1];
NSLog(@"cut lon: %@", loncutstring);

double latdouble = [latcutstring doubleValue];
NSLog(@"latdouble: %f", latdouble);
double londouble = [loncutstring doubleValue];
NSLog(@"londouble: %f", londouble);

感谢 Phillip Mills 和 Tobol 的帮助。

编辑:2012 年 11 月

正如 craig 和 phillip 所说,这是空白导致的问题,我找到了一种更安全的方法来避免删除所需的字符。

NSString *trimlat = [theList.lat stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSString *trimlon = [theList.lon stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    //Convert to double
    double latdouble = [trimlat doubleValue];
    double londouble = [trimlon doubleValue];

    //Create coordinate
    CLLocationCoordinate2D coord = {(latdouble),(londouble)};

【讨论】:

  • 很高兴你能成功。不过,我会很紧张,因为在不知道为什么会出现第一个字符的情况下剪掉它。由于它来自未知原因,因此无法保证下次它不会是 0 或 2 个字符。
  • 是的,我知道你的意思我试图追溯数据,但我很难找出额外的字符是什么。我已经浏览了我的 xml 文件中的每个位置,它们都显示在 mapview 的正确位置。它适用于这个项目,但它可能不适用于其他项目,因为你说可能有不同数量的字符。但现在它会做。
  • 我同意 Phillip 的观点,在不知道原因的情况下剪切任意数量的字符可能意味着您不会处理任何新内容。所以你在英国,你有两位数的正纬度和一位数的经度(我猜你已经尝试过正数和负数)。但是对于他们有三位数负经度的美国呢,你可能会切断重要的负号,这会将他们所有的点转移到中国。您提供的 XML 只有 9 个字符,但您收到 10 个字符,这意味着您的 XML 提取需要工作。解决这个问题,所有坐标都应该工作。
【解决方案2】:

我认为这些字符串的格式化程序不好。数字前只能有空格。 lat 和 lon 的格式必须像 'dd.dddddddd'。

    NSString *works = @"  12.5431 jdty";
    NSString *doesntWorks = @"E 43.4345";
    NSString *latstring = [[NSString alloc] initWithString:works] ;
    NSString *lonstring = [[NSString alloc] initWithString:doesntWorks];
    NSLog(@"latstring: %@, lonstring: %@", latstring, lonstring);

    double latdouble = [latstring doubleValue];
    double londouble = [lonstring doubleValue];
    NSLog(@"latdouble: %g, londouble: %g", latdouble, londouble);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多