【问题标题】:How to modify number using NSNumberFormatter? [closed]如何使用 NSNumberFormatter 修改数字? [关闭]
【发布时间】:2013-04-14 02:12:45
【问题描述】:

我有如下价值观:

5.1M (5100000)
80M (80000000)
300.5M (300500000)

5K (5000)
2000K (2000000)
200.5K (200500)

(我需要将它们转换成的值在数字后面的括号中)。

基本上,一个数字可以有小数点或没有小数点,可以以 K(千)或 M(百万)结尾,但仅当它是整数时(即 0.5M 需要为 500000;没有逗号)。

我还需要能够将数字转换回原来的形式。

我该怎么做,最好的方法是什么?

【问题讨论】:

  • 你试过什么?这真的不是为您提供解决方案的地方,而是当您尝试自己解决问题并需要帮助时来的地方。
  • 最好的方法是使用NSNumberFormatter。文档是一个很好的资源。说真的。
  • 我知道 NSNumberFormatter。我不知道从哪里开始。我一直在阅读 Apple 的文档,但无法真正找到工作或找出最好的方法。
  • 顺便说一句 - 1000 的正确单位是 k,而不是 K。

标签: objective-c numbers numberformatter


【解决方案1】:

所以你是说你有一个以数字开头并以 K 或 M 结尾的 NSString?你想看看它是由什么组成的,然后把它转换成一个实际的数值?这是 NSScanner 的工作。

不过,老实说,NSScanner 早在正则表达式在 Objective-C 中可用之前就已经存在了。现在我可能只使用 NSRegularExpression。

或者,如果你知道一个事实它真的是一个后跟K或M的数字,那么你甚至不必这样做。只需将最后一个字符从末尾拉出即可。那是K或M,你现在知道它是什么了。剩下的是一个数字字符串,你可以把它转换成一个数字。

伪代码(未测试):

NSString* s = @"5.1M";
NSUInteger len = s.length;
NSString* numPart = [s substringToIndex: len-2];
NSString* unitPart = [s substringFromIndex: len-1];
int multiplier = 1000;
if ([unitPart isEqualToString: @"M"])
    multiplier = 1000000;
float result = numPart.floatValue * multiplier;

【讨论】:

  • 谢谢。我已经想通了。它可能并不总是后面跟着 K 或 M,所以我会先检查是否以 K 或 M 结尾。
【解决方案2】:

不久前,我编写并开源了一个名为 SQSMetricFormatter (https://github.com/shultzc/SQSMetricFormatter) 的自定义 NSNumberFormatter,它使用公制前缀格式化数字。

它可能会满足您的需求,或者至少为实施您自己的解决方案提供一个起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 2020-06-02
    • 1970-01-01
    • 2022-08-19
    • 2017-01-26
    • 1970-01-01
    • 2019-08-06
    • 2019-07-15
    相关资源
    最近更新 更多