我有如下价值观:
5.1M (5100000)
80M (80000000)
300.5M (300500000)
5K (5000)
2000K (2000000)
200.5K (200500)
(我需要将它们转换成的值在数字后面的括号中)。
基本上,一个数字可以有小数点或没有小数点,可以以 K(千)或 M(百万)结尾,但仅当它是整数时(即 0.5M 需要为 500000;没有逗号)。
我还需要能够将数字转换回其原始形式。
我该怎么做,最好的方法是什么?
我有如下价值观:
5.1M (5100000)
80M (80000000)
300.5M (300500000)
5K (5000)
2000K (2000000)
200.5K (200500)
(我需要将它们转换成的值在数字后面的括号中)。
基本上,一个数字可以有小数点或没有小数点,可以以 K(千)或 M(百万)结尾,但仅当它是整数时(即 0.5M 需要为 500000;没有逗号)。
我还需要能够将数字转换回其原始形式。
我该怎么做,最好的方法是什么?
不久前,我编写并开源了一个名为 SQSMetricFormatter ( https://github.com/shultzc/SQSMetricFormatter ) 的自定义 NSNumberFormatter,它使用公制前缀格式化数字。
它可能会满足您的需求,或者至少为实现您自己的解决方案提供一个起点。
所以你是说你有一个以数字开头并以 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;