【问题标题】:NSString stringWithFormat not working with special chars like currency symbolsNSString stringWithFormat 不适用于货币符号等特殊字符
【发布时间】:2015-01-22 06:57:36
【问题描述】:

我最近在使用NSStringstringWithFormat: 方法时遇到了很多麻烦。我编写了一个对象,它允许您将 N 行文本(由新行分隔)居中、右或左对齐。我逻辑的核心是NSStringstringWithFormat。我使用此函数在各个行的左侧或右侧用空格填充我的字符串,以产生我想要的对齐方式。这是一个例子:

NSString *str = @"$3.00" --> 3 dollars
[NSString stringWithFormat:@"%8s", [str cStringUsingEncoding:NSUnicodeStringEncoding]] --> returns --> "   $3.00"

如您所见,上面的示例效果很好,我在左侧填充了 3 个空格,结果文本右对齐/对齐。当我开始传入外币符号时,问题开始出现,直接格式化不起作用。它要么添加额外的符号,要么只返回垃圾。

NSString *str = @"Kč1.00" --> 3 Czech Koruna (Czech republic's currency)
[NSString stringWithFormat:@"%8s", [str cStringUsingEncoding:NSUnicodeStringEncoding]] --> returns --> "  Kč1.00"

以上内容完全是错误的......现在我不是字符串编码专家,但我知道NSString 对基本 ASCII 域之外的特殊字符使用国际标准化 unicode 编码。

如何解决我的问题?我应该使用什么编码?我已经尝试了很多不同的编码枚举,我已经数不清了,从NSMACOSRomanEncodingNSUTF32UnicodeBigEndian.. 我最后的办法是完全放弃使用 stringWithFormat ,也许它只适用于简单的 UTF8Strings 和基本符号。

【问题讨论】:

  • 您不会因此而走运。切换到 NSNumberFormatter。正是为此目的而设计的,包括覆盖货币为前缀和后缀的语言环境,包括否定的本地样式表示等。
  • 是的,我想我只是要从使用 stringWithFormat 切换。谢谢

标签: ios objective-c unicode nsstring stringwithformat


【解决方案1】:

如果您想表示货币,最好使用带有货币样式的NSNumberFormatter (NSNumberFormatterCurrencyStyle)。它读取 currentLocale 并根据它显示货币。你只需要询问它的字符串表示并附加到一个字符串。 这将比管理 unicode 格式容易得多,查看教程here

【讨论】:

  • 是的@Andrea我同意 NSNumberFormatter 是货币的方式......但我的对象应该对齐任何文本/字符串。我不想编写更专业的代码来处理货币符号情况,那里没有足够的附加值。也许更好的方法是只使用 NSString 的 padSpace 方法而忘记一起使用 stringWithFormat 。我试图让这个与通用 NSString 无关,任何传入的字符串都应该是合理的。
  • 这里最好避免使用 stringWithFormat。
  • 老实说,我没有完全理解这个问题,例如,为什么你创建了一个特定的对象来显示文本并且没有使用带有属性字符串的标签或文本视图?编码字符串真的很痛苦
  • 它太多了解释和 id 而不是进入这些细节,因为它超出了手头问题的范围。我真正的问题是为什么我不能为“stringWithFormat:”指定一个只适用于货币符号字符的字符串编码。显然,这个问题的答案是你只是不这样做,而且如果不把你的手弄脏,这是不可能的。最干净的方法是通过我之前研究过的 NSNumberFormatter 。只是想知道是否有人知道这样做的编码方式
  • 注意新版XCODE模拟器有bug,设置里设置locale不会改变;-)
【解决方案2】:

这将为您提供所需的结果

 NSString *str = @"Kč1.00";

str=[NSString stringWithFormat:@"%@%8@",[@" " stringByPaddingToLength:3    withString:@" " startingAtIndex:0],str];

输出:@"Kč1.00";

【讨论】:

  • 我的回答有问题或者我没有理解问题?
  • 你为什么会提出如此复杂的答案?我只是在问我应该使用哪种编码,所以我可以简单地使用 stringWithFormat.. 或者如果 stringWithFormat 不是要走的路......而且你的解决方案不是动态的,它似乎只适合你的例子的目的。
【解决方案3】:

还有一个技巧可以实现这一点 - 如果你喜欢使用它:)

[NSString stringWithFormat:@"%8s%@",[@"" cStringUsingEncoding:NSUTF8StringEncoding],str]; 

这也行。

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 2011-11-26
    • 2016-03-03
    • 1970-01-01
    • 2019-02-23
    • 2013-07-03
    • 2021-11-07
    • 2016-09-13
    • 2019-09-17
    相关资源
    最近更新 更多