将非常大的 NSDecimal 转换为字符串,例如。 400,000,000,000 -> 400 T 等等

Posted

技术标签:

【中文标题】将非常大的 NSDecimal 转换为字符串,例如。 400,000,000,000 -> 400 T 等等【英文标题】:Converting very large NSDecimal to string eg. 400,000,000,000 -> 400 T and so forth 【发布时间】:2016-03-20 19:07:06 【问题描述】:

我正在制作一个需要我使用非常大的数字的游戏。我相信我能够使用 NSDecimal 存储非常大的数字。但是,当向用户显示数字时,我希望能够将大数字转换为使用字符表示值的简洁字符串,例如。 100,000 -> 100k 1,000,000 -> 1.00M 4,200,000,000 -> 4.20B 等等,直到非常大的数字。是否有任何内置方法可以这样做,或者我必须使用一堆

NSDecimalCompare 语句判断数字的大小并进行转换?

我希望在应用程序中使用目标 c。

我知道我可以使用 NSString *string = NSDecimalString(&NSDecimal, _usLocale);转换为字符串,然后我可以对此字符串进行某种类型的比较以获得我正在寻找的结果吗?

【问题讨论】:

使用NSByteCountFormatter 【参考方案1】:

使用此方法将您的号码转换为您需要的更小的格式:

-(NSString*) suffixNumber:(NSNumber*)number

    if (!number)
        return @"";

    long long num = [number longLongValue];

    int s = ( (num < 0) ? -1 : (num > 0) ? 1 : 0 );
    NSString* sign = (s == -1 ? @"-" : @"" );

    num = llabs(num);

    if (num < 1000)
        return [NSString stringWithFormat:@"%@%lld",sign,num];

    int exp = (int) (log(num) / 3.f); //log(1000));

    NSArray* units = @[@"K",@"M",@"G",@"T",@"P",@"E"];

    return [NSString stringWithFormat:@"%@%.1f%@",sign, (num / pow(1000, exp)), [units objectAtIndex:(exp-1)]];

一些示例:

NSLog(@"%@",[self suffixNumber:@99999]); // 100.0K
NSLog(@"%@",[self suffixNumber:@5109999]); // 5.1M

Source

【讨论】:

不幸的是,我需要使用大于可以存储在 NSNumber 中的数字,我需要使用 NSDecimal。【参考方案2】:

解决了我的问题:仅当您知道您尝试格式化的 NSDecimal 将只是一个没有小数的整数时才能使用,因此在对 NSDecimal 进行任何数学运算时请确保您四舍五入。

-(NSString *)returnFormattedString:(NSDecimal)nsDecimalToFormat

NSMutableArray *formatArray = [NSMutableArray arrayWithObjects:@"%.2f",@"%.1f",@"%.0f",nil];

NSMutableArray *suffixes = [NSMutableArray arrayWithObjects:@"k",@"M",@"B",@"T",@"Qa",@"Qi",@"Sx",@"Sp",@"Oc",@"No",@"De",@"Ud",@"Dud",@"Tde",@"Qde",@"Qid",@"Sxd",@"Spd",@"Ocd",@"Nvd",@"Vi",@"Uvi",@"Dvi",@"Tvi", nil];

int dick = [suffixes count];

NSLog(@"count %i",dick);

NSString *string = NSDecimalString(&nsDecimalToFormat, _usLocale);
NSString *formatedString;
NSUInteger characterCount = [string length];
if (characterCount > 3) 

    NSString *trimmedString=[string substringToIndex:3];

    float a;

    a = 100.00/(pow(10, (characterCount - 4)%3));
    int remainder = (characterCount-4)%3;


    int suffixIndex = (characterCount + 3 - 1)/3 - 2;
    NSLog(@"%i",suffixIndex);
    if(suffixIndex < [suffixes count])
        NSString *formatSpecifier = [formatArray[remainder] stringByAppendingString:suffixes[suffixIndex]];
        formatedString= [NSString stringWithFormat:formatSpecifier,  [trimmedString floatValue] / a];

    
    else 
        formatedString = @"too Big";
    


else
    formatedString = string;


return formatedString;


【讨论】:

您可以将其压缩为一个简单的公式,将characterCount 转换为suffixes 的索引。类似(characterCount - 1) / 3 - 1 使用index = ceil((characterCount - 6) / 3.0f)计算suffixes的索引 谢谢大家刚刚意识到,在我发布它并意识到我可以将字符数四舍五入 / 3 并减去 2 以获得索引 当心索引越界!另外,(characterCount + 3 - 1)/3 - 2 不正确。 是的,事实上它是正确的。 -1 输出太短的字符串让我很吃惊。

以上是关于将非常大的 NSDecimal 转换为字符串,例如。 400,000,000,000 -> 400 T 等等的主要内容,如果未能解决你的问题,请参考以下文章

将非常大的数字转换为十六进制字符串

如何在Java中将非常大的十进制数转换为二进制数

NSDecimal 需要桥接

如何在php中将非常小的、正常的、大的、科学的数字转换为字符串

XML 到 JSON 的动态转换

Swift - 将两个 NSDecimal 数字相乘