如何在没有科学计数法或小数的情况下格式化数字

Posted

技术标签:

【中文标题】如何在没有科学计数法或小数的情况下格式化数字【英文标题】:How to Format Numbers Without Scientific Notation or Decimals 【发布时间】:2013-01-22 02:07:57 【问题描述】:

我的目标是为 iPhone 创建一个客户计算器应用程序,并使用 Xcode 编写我的应用程序。我找不到解决方案的问题是如何在不使用科学记数法或一组小数的情况下格式化数字。

我试过了……

buttonScreen.text = [NSString stringWithFormat:@"%f",currentNumber];

buttonScreen.text = [NSString stringWithFormat:@"%g",currentNumber];

%f 格式总是在小数点后打印 6 位数字,所以如果用户输入“5”,它会显示 5.000000。

%g 格式在 6 位后跳转到科学计数法,因此 1000000 显示时变为 1e+06。

我希望能够在没有无意义的小数或科学记数法的情况下显示以下数字:

123,456,789;
1.23456789;
12345.6789;
-123,456,789;
-1.23456789;
-12345.6789;

【问题讨论】:

我稍微编辑了您的问题以符合一般的 SO 样式指南,并将 %s 添加到您的格式字符串中。如果我误传了什么,请告诉我!另外,第一个问题很好。 好吧,如果你想避免使用小数,我建议使用八进制表示法。当然,您可以使用二进制文件,但它不是很紧凑。 【参考方案1】:

对于浮点数格式,您可以使用 %f,并且您必须指定最小字段宽度和字符精度。如果使用 %4.2f,则表示最小宽度为 4 个字符(如果使用少于 4 个,将在左侧填充空格)和 2 个字符以表示精度。如果您想要 10 个最小宽度字符和 0 个小数精度,请使用 %10.0f 。

在您的特定情况下,您应该使用 %.0f 来表示没有十进制精度的数字。

buttonScreen.text = [NSString stringWithFormat:@"%.0f",currentNumber];

您可以找到快速参考here。不是objective-c文档,而是等价的。

为了完整起见,你可以在下面找到 NSString 格式化的规范文档:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/FormatStrings.html

这里:

http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html

编辑截断:

buttonScreen.text = [NSString stringWithFormat:@"%d",(int)currentNumber];

但是,您应该阅读一些关于浮动表示、精度和强制转换的内容,以了解可能的不良行为。

【讨论】:

嗨路易斯埃斯皮诺萨!我尝试使用 %.0f,它似乎可以清除以科学计数法编写的大量数字,但是当我尝试在数字上添加小数时(例如 15,400,179.85),数字会四舍五入(因此输出为 15,400,180)。 %.0f 是的,没错。您想要实现的行为是什么?对我来说,在实现没有小数的计算器时四舍五入似乎是正确的,但也许你有一些想法。要截断数字吗? 在这种情况下,您应该将浮点数转换为整数并使用 %d 打印。但是,您应该阅读一些关于浮动表示、精度和强制转换的内容,以了解可能的不良行为。 我仍然想要数字中的小数(没有四舍五入或截断),数字末尾没有额外的 0(零)。很抱歉造成混乱! 在这种情况下,我建议您接受这个答案(点击“检查”符号),然后提出一个新问题。满足新要求的答案将与当前问题相冲突。【参考方案2】:

看看NSNumberFormatter

配置正确,它可以在适当的时候添加逗号。您还需要告诉它要使用多少位有效数字。

【讨论】:

【参考方案3】:

您与 Xcode 和 Objective-c 的交互并不像您在这里怀疑的那样多,底层实现是 printf。查看this tutorial on how to use printf format specifiers。

【讨论】:

【参考方案4】:

那么你希望它看起来像什么? stringWithFormat 格式是旧 C sprintf 的超集。那么您是否尝试过使用 d 和变体来满足自己的喜好?

【讨论】:

以上是关于如何在没有科学计数法或小数的情况下格式化数字的主要内容,如果未能解决你的问题,请参考以下文章

科学记数法数字转换/保留数值小数点位数(数字格式化)

excel中长数字字符串会默认变成科学计数法,如何去除?

使用 DecimalFormat 格式化 Double 以在没有科学计数法的情况下打印

怎么将科学计数法

如何防止excel身份证号码变成科学计数法(后四位变成0)

Java中的紧凑数字格式化行为(在十进制和科学记数法之间自动切换)