如何在NSNumberFormatter的输出上强制使用符号字符

Lav*_*der 11 objective-c nsnumberformatter ios

我想使用数字格式化程序来生成我的输出,因此数字会自动格式化为用户的语言环境,但是我希望它在printf()中"%+.1f"一样工作,它总是有指定的符号.

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
nf.numberStyle = NSNumberFormatterDecimalStyle;
nf.maximumFractionDigits = 1;

double val = 3.1234;
label.text = [NSString stringWithFormat: @"XXX %@ XXX", [nf stringFromNumber: [NSNumber numberWithDouble: val]]];
Run Code Online (Sandbox Code Playgroud)

我希望标签在美国出现"XXX +3.1 XXX",并为任何其他位置提供相应但等效的字符串.我能找到的唯一的东西是setPositiveFormat:setPositivePrefix:.

但我希望设置的格式,因为我不知道如何在其他国家的格式化数字; 我不知道是否使用加号来指定阿拉伯语或俄语中的正数或某些我没有想到的文化.我知道,例如,小数点,逗号,空格等在欧洲国家与美国相比都有不同的含义 - 对于+/-符号也是如此吗?

我现在做的是:

label.text = [NSString stringWithFormat: @"XXX %s%@ XXX", (val < 0) ? "" : "+",
    [nf stringFromNumber: [NSNumber numberWithDouble: val]]];
Run Code Online (Sandbox Code Playgroud)

但这假定'+'和' - '对所有格式都是正确的.

我敢肯定它一定存在,因为它是一个标准格式化的东西,自从黑暗时代以来一直在printf()中 ...

rma*_*ddy 15

这个怎么样:

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
nf.numberStyle = NSNumberFormatterDecimalStyle;
nf.maximumFractionDigits = 1;

double val = 3.1234;
NSString *sign = (val < 0) ? [nf minusSign] : [nf plusSign];
NSString *num = [nf stringFromNumber:@(abs(val))]; // avoid double negative
label.text = [NSString stringWithFormat: @"XXX %@%@ XXX", sign, num];
Run Code Online (Sandbox Code Playgroud)

您可能需要检查是否numsign前缀,因此它不会显示两次.

编辑:经过一些游戏后,已经确定,对于"十进制"样式,当前的语言环境没有使用positivePrefix.当前区域设置不使用plusSign标准+字符以外的其他区域设置.当前区域设置不使用与之negativePrefix不同的区域设置minusSign.当前的语言环境都不使用positiveSuffixnegativeSuffix.

因此,更简单的方法是:

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
nf.numberStyle = NSNumberFormatterDecimalStyle;
nf.maximumFractionDigits = 1;
[nf setPositivePrefix:[nf plusSign]];
[nf setNegativePrefix:[nf minusSign]];

label.text = [nf stringFromNumber:@(val)];
Run Code Online (Sandbox Code Playgroud)


Ram*_*uri 7

这种情况很简单,只需添加前缀:

nf.positivePrefix= nf.plusSign;
Run Code Online (Sandbox Code Playgroud)

  • 这是本地化的吗? (2认同)