将基本脚本转换为目标C(货币格式) [英] Convert basic script to Objective C (money formatting)

查看:88
本文介绍了将基本脚本转换为目标C(货币格式)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基本的脚本,我需要将其转换为目标c,它将大笔资金转换为简化版本(例如:1.2m等),我已经完成了大部分转换,但是我遇到的最大问题就是最后.

I've got this basic like script that I need to convert to objective c, it turns big units of money into shortened versions (ie: 1.2m, etc), I've got most of the conversion done, but the biggest problem I'm having is right at the end.

原始基本代码为:

; Basic Code

Function ShortCash$(BigNumber)
out$=""


    ; First, grab the length of the number
    L=Len(BigNumber)

    Letter$=""

    ;Next, Do a sweep of the values, and cut them down.
        If l<13 
            out$=(BigNumber/1000000000)

            ; For each figure, out remainder should be divided so that it leaves a 2 digit decimal number..
            remainder=(BigNumber Mod 1000000000)/10000000

            ; And we also want a letter to symbolise our large amounts..
            Letter$="b" ; BILLION!!!!
        EndIf
        If l<10 Then out$=(BigNumber/1000000):remainder=(BigNumber Mod 1000000)/10000:Letter$="m"
        If l<7 Then out$=(BigNumber/1000):remainder=(BigNumber Mod 1000)/10:Letter$="k"
        If l<4 Then out$=BigNumber:remainder=0:Letter$=""

    ;Next, if remainder=0 then we're happy..  ie, £1m is fine, we need no decimal.
    ;But, if the remainder is >0 we'll want a nice rounded 2 decimal number, instead.
    If remainder>0
        out$=out$+"."+Right$("00"+remainder,2) ; Last two numbers..

        ; Additionally, if the rightmost figure is a 0, remove it.
        ; (ie, if the value is 1.50, we don't need the 0)
        If Right$(out$,1)="0" Then out$=Left$(out$,Len(out$)-1)

    EndIf


    ; And throw on our letter, at the end.
    out$=out$+letter$ 

Return out$
End Function

//以下文章的作者于8月5日星期四进行了编辑.

// The following was edited on Thur 5 Aug by Author of post.

我相信我现在已经把它整理好了,目前我有以下工作可以成千上万个工作,我不确定它是否在所有情况下都可以工作,并欢迎对此提供任何帮助/指导.我知道内存问题,稍后再解决,这是我首先要解决的字符串处理部分.

I believe I've got it sorted now, I've got the following to work for thousands for the moment, I'm not sure if it will work under all circumstances and would welcome any help/guidance on this. I am aware of the memory issues, I'll sort that out later, its the string manipulation part I am resolving first.

// This goes inside the (IBAction) update method;

    NSNumber *bigNumber = nil;

    if ( [inputField.text length] >0)
    {
        bigNumber = [NSNumber numberWithInt:[inputField.text intValue]];
    }

    int bigNumberAsInt          = [bigNumber intValue];
    NSString *bigNumberAsString = [bigNumber stringValue];
    int bigNumberStrLen         = [bigNumberAsString length];

    NSLog(@"bigNumber = %@", bigNumber);
    //NSLog(@"bigNumberAsString = %@", bigNumberAsString);
    NSLog(@"bigNumberStrLen = %d", bigNumberStrLen);
    NSLog(@"=========");

    // =========

    NSNumberFormatter *nformat = [[[NSNumberFormatter alloc] init] autorelease];

    [nformat setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [nformat setCurrencySymbol:@"$"];
    [nformat setNumberStyle:NSNumberFormatterCurrencyStyle];
    [nformat setMaximumFractionDigits:0];

    NSLog(@"Cash = %@", [nformat stringFromNumber:bigNumber]);

    // =========


    NSString *output = [[NSString alloc] init]; 
    NSString *letter;


    // ==========

    // Anything less than 1m represent with a k
    if (bigNumberStrLen < 7) 
    {
        letter = @"k";
        int sum = (bigNumberAsInt / 1000);
        int int_remainder = ((bigNumberAsInt % 1000) / 10);

        NSLog(@"Remainder = %d", int_remainder);

        NSString *sumAsString = [NSString stringWithFormat:@"%d", sum];
        NSString *remainderAsString = [NSString stringWithFormat:@"%d", int_remainder];

        NSLog(@"Sum as String = %@", sumAsString);
        NSLog(@"Remainder as String = %@", remainderAsString);

        if (int_remainder >0)
        {
            NSLog(@"Remainder > 0");

            output = [output stringByAppendingString:sumAsString];
            output = [output stringByAppendingString:@"."];
            output = [output stringByAppendingString:remainderAsString];

            NSLog(@"Output = %@", output);

            NSUInteger outputStrLen = [output length];

            NSLog(@"Output strlen = %d", outputStrLen);

            if ([output hasSuffix:@"0"])
            {
                NSLog(@"Has suffix of 0");

                // Remove suffix
                output = [output substringWithRange: NSMakeRange(0, outputStrLen-1)];
            }

        }

        output = [output stringByAppendingString:letter];

        NSLog(@"Final output = %@", output);


    }

这将显示10.2k(如果后缀0结束),或者显示10.2x,其中X是最后一个数字.

This will display 10.2k (if it ends with a 0 suffix) or it will display 10.2x where X is the last number.

有人可以仔细检查一下吗,或者也许有一种更简单的方法来完成所有这些操作.无论哪种情况,谢谢您的帮助.

Can someone just double check this, or perhaps there's an easier way to do all this. In either case, thanks for your help.

推荐答案

....好的,感谢

.... Okay, with thanks to the author of the Cocoa Tidbits blog, I believe I have a solution which is much more elegant, faster and doesn't require so much coding; it still needs testing, and it also probably requires a little more editing, but it seems to be much better than my original.

我对脚本进行了一些修改,以使其在相关时不显示任何尾随零;

I modified the script a little to make it not show any trailing zeros where relevant;

    NSNumberFormatter *nformat = [[NSNumberFormatter alloc] init];
    [nformat setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [nformat setCurrencySymbol:@"$"];
    [nformat setNumberStyle:NSNumberFormatterCurrencyStyle];
    double doubleValue = 10200;
    NSString *stringValue = nil;
    NSArray *abbrevations = [NSArray arrayWithObjects:@"k", @"m", @"b", @"t", nil] ;

    for (NSString *s in abbrevations)
    {

        doubleValue /= 1000.0 ;

        if ( doubleValue < 1000.0 )
        {

            if ( (long long)doubleValue % (long long) 100 == 0 ) {
                [nformat setMaximumFractionDigits:0];
            } else {                
                [nformat setMaximumFractionDigits:2];
            }

            stringValue = [NSString stringWithFormat: @"%@", [nformat stringFromNumber: [NSNumber numberWithDouble: doubleValue]] ];
            NSUInteger stringLen = [stringValue length];

            if ( [stringValue hasSuffix:@".00"] )
            {               
                // Remove suffix
                stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-3)];            
            } else if ( [stringValue hasSuffix:@".0"] ) {

                // Remove suffix
                stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-2)];

            } else if ( [stringValue hasSuffix:@"0"] ) {

                // Remove suffix
                stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-1)];        
            }


            // Add the letter suffix at the end of it
            stringValue = [stringValue stringByAppendingString: s];

            //stringValue = [NSString stringWithFormat: @"%@%@", [nformat stringFromNumber: [NSNumber numberWithDouble: doubleValue]]  , s] ;
            break ;
        }   
    } 

    NSLog(@"Cash = %@", stringValue);

这篇关于将基本脚本转换为目标C(货币格式)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆