NSString stringWithFormat 不适用于货币符号等特殊字符
NSString stringWithFormat not working with special chars like currency symbols
我最近在使用 NSString
的 stringWithFormat:
方法时遇到了很多麻烦。我已经编写了一个对象,它允许您将 N 行文本(由新行分隔)居中、向右或向左对齐。我逻辑的核心是 NSString
的 stringWithFormat
。我使用此函数在各个行的左侧或右侧用空格填充我的字符串,以生成我想要的对齐方式。这是一个例子:
NSString *str = @".00" --> 3 dollars
[NSString stringWithFormat:@"%8s", [str cStringUsingEncoding:NSUnicodeStringEncoding]] --> returns --> " .00"
如您所见,上面的示例效果很好,我在左侧填充了 3 个空格,结果文本是正确的 aligned/justified。当我开始传递外币符号时,问题开始出现,直接格式化不起作用。它要么添加额外的符号,要么只是 returns 垃圾。
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 编码。
我该如何解决我的问题?我应该使用什么编码?我尝试了很多不同的编码枚举,我已经记不清了,从 NSMACOSRomanEncoding
到 NSUTF32UnicodeBigEndian
.. 我最后的选择是完全放弃使用 stringWithFormat 一起使用,也许它只适用于简单的 UTF8Strings和基本符号。
这将为您提供所需的结果
NSString *str = @"Kč1.00";
str=[NSString stringWithFormat:@"%@%8@",[@" " stringByPaddingToLength:3 withString:@" " startingAtIndex:0],str];
输出:@"Kč1.00";
只需一个技巧即可实现此目标 -
如果你喜欢使用它:)
[NSString stringWithFormat:@"%8s%@",[@"" cStringUsingEncoding:NSUTF8StringEncoding],str];
这也行。
如果你想表示货币,使用带有货币样式的 NSNumberFormatter
(NSNumberFormatterCurrencyStyle
) 会好很多。它读取 currentLocale 并显示基于它的货币。您只需要询问它的字符串表示形式并附加到一个字符串即可。
这将比管理 unicode 格式容易得多,请查看教程 here
我最近在使用 NSString
的 stringWithFormat:
方法时遇到了很多麻烦。我已经编写了一个对象,它允许您将 N 行文本(由新行分隔)居中、向右或向左对齐。我逻辑的核心是 NSString
的 stringWithFormat
。我使用此函数在各个行的左侧或右侧用空格填充我的字符串,以生成我想要的对齐方式。这是一个例子:
NSString *str = @".00" --> 3 dollars
[NSString stringWithFormat:@"%8s", [str cStringUsingEncoding:NSUnicodeStringEncoding]] --> returns --> " .00"
如您所见,上面的示例效果很好,我在左侧填充了 3 个空格,结果文本是正确的 aligned/justified。当我开始传递外币符号时,问题开始出现,直接格式化不起作用。它要么添加额外的符号,要么只是 returns 垃圾。
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 编码。
我该如何解决我的问题?我应该使用什么编码?我尝试了很多不同的编码枚举,我已经记不清了,从 NSMACOSRomanEncoding
到 NSUTF32UnicodeBigEndian
.. 我最后的选择是完全放弃使用 stringWithFormat 一起使用,也许它只适用于简单的 UTF8Strings和基本符号。
这将为您提供所需的结果
NSString *str = @"Kč1.00";
str=[NSString stringWithFormat:@"%@%8@",[@" " stringByPaddingToLength:3 withString:@" " startingAtIndex:0],str];
输出:@"Kč1.00";
只需一个技巧即可实现此目标 - 如果你喜欢使用它:)
[NSString stringWithFormat:@"%8s%@",[@"" cStringUsingEncoding:NSUTF8StringEncoding],str];
这也行。
如果你想表示货币,使用带有货币样式的 NSNumberFormatter
(NSNumberFormatterCurrencyStyle
) 会好很多。它读取 currentLocale 并显示基于它的货币。您只需要询问它的字符串表示形式并附加到一个字符串即可。
这将比管理 unicode 格式容易得多,请查看教程 here