【问题标题】:Stripping the 12 Hour clock suffix from an NSString从 NSString 中去除 12 小时制后缀
【发布时间】:2010-01-21 07:22:08
【问题描述】:

我的 iPhone 应用中时间标签的屏幕空间不足。 我的解决方案是有时间,例如12:00 在一行中,然后如果用户当前的语言环境指定使用 AM-PM,则将它们放在其下方的第二个标签中。

由于 AM-PM 也有本地化的变体,我不能只寻找字母“AM”或“PM”,然后我想去掉最后两个字母,但通过检查我发现有些语言使用的格式像这个:“调频” “E.M”。我的下一个想法是删除前 5 位数字之后的所有内容(12:34),但是对于低于 10 的小时间隔也不好。

是否有一种“语言环境安全”的方式来始终删除本地化后缀并将其移动到新字符串,而不管用户设置如何?

提前谢谢你:)

【问题讨论】:

    标签: iphone localization nsstring


    【解决方案1】:

    没有区域设置安全的方法可以做到这一点。

    使用NSDateFormatter 生成两个字符串。

    NSDateFormatter  *timeOfDayFormatter = [[[NSDateFormatter alloc] init] retain];
    [timeOfDayFormatter setDateFormat:@"hh:mm"];
    
    NSDateFormatter  *amPmFormatter = [[[NSDateFormatter alloc] init] retain];
    [amPmFormatter setDateFormat:@"aa"];
    
    
    NSLog(@"Time is: %@ %@",
        [timeOfDayFormatter stringFromDate:theDate],
        [amPmFormatter stringFromDate:theDate]);
    

    现在您可以使用这两个字符串来布局您的用户界面。

    24 小时制是我居住的标准。如果屏幕空间是一个真正的问题,我会“强制”用户使用这种格式。

    【讨论】:

    • 嗨 Niels,谢谢:) 我已经有一个 NSDate 对象,我可以轻松地“强制”用户使用 24 小时格式(这将使世界变得更简单),但我想尊重他们的设置.当我与具有 24 小时格式的用户打交道时,没问题。但是当它是 12 小时格式时,我需要升起一个标志并从字符串中删除“AM”或“PM”后缀并将其移动到单独的 UILabel。该应用程序处理约会,所以时间和日期很重要,我不希望用户对时间感到不确定或怀疑(就像我在处理 12 小时制时一样:))
    • 我要么使用 24 小时表示法,要么采用完整的 AM/PM 表示法。我认为您不能尊重用户的区域设置 破坏显示格式。也许还有其他方法可以通知用户约会即将到来……“10 分钟后”、红旗、时钟图标或类似的东西?太阳或月亮图标?
    • 嗨尼尔斯。这更像是一个 NSString 问题而不是 NSDate 问题。我使用 NSDateFormatterShortStyle 作为日期。将其转换为 NSString。如果此字符串包含 12 小时时钟后缀,请将此后缀移动到时间标签下方的标签中。这对其他事情也有好处。例如AM PM 后缀当然与它所在的标签的字体大小相同。通过删除它并将其显示在单独的标签中,我还可以将大小设置为小于时间标签的大小。再次感谢。
    • 啊,然后使用两个格式化程序,一个用于时间,一个用于后缀(无论在相关区域设置中是什么)。您甚至可以将 AM/PM 布局为时间的子脚本或超级脚本。如 1^2。祝您申请顺利!
    • 嗨尼尔斯。实际上,我在应用程序中有一个不同的地方,我需要在时间之后加上后缀,但是我发现 AM/PM 的大小太大了,这里的下标是完美的。谢谢你提到那个:)
    【解决方案2】:

    我最终这样解决了它,然后用 15 种以上的语言环境设置手动测试它:

    NSArray *timeParts = [NSArray arrayWithArray:[[timeFormatter stringFromDate:myDate] componentsSeparatedByString:@" "]];
    

    然后我测试timeParts数组:

    if ([timeParts count] > 1) {...}
    

    如果count 是 1,它是一个没有后缀的语言环境,我没有设置“AM/PM”标签。 否则,我设置了两个标签,[timeParts objectAtIndex:0] 的 timeLable 和 [timeParts objectAtIndex:1] 的 localeLabel

    这似乎是适用于所有语言环境的稳定解决方案。

    【讨论】:

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