2013-02-07 32 views
0

我正在製作一個具有羅馬數字模式的計算器。我有在模型視圖中執行的操作和一個視圖控制器。我的問題是我需要將羅馬數字轉換爲NSNumber。有一個UILabel,並且視圖控制器獲取標籤中的內容並將其設置爲模型視圖的操作數。有誰知道我可以如何從標籤中取出羅馬數字並將其作爲NSNumber?下面是一些代碼:如何將羅馬數字轉換爲NSNumer

- (IBAction)digitPressed:(UIButton *)sender { 


    NSString *digit = [[sender titleLabel] text]; 
    if (self.userIsTypingNumber) { 
     [self.display setText:[self.display.text stringByAppendingString:digit]]; 
    } else { 
     [self.display setText:digit]; 
     self.userIsTypingNumber = YES; 
    } 
} 

- (IBAction)operationPressed:(UIButton *)sender { 

    if (self.userIsTypingNumber) { 
     if ([self isValidForRoman:self.display.text] == YES) { 
      //find out what roman numeral is in the display 
     } else { 
     NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init]; 
     [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; 
     NSNumber *n = [numberFormatter numberFromString:self.display.text]; 
     [[Model singleton] setOperand:n]; 
     self.userIsTypingNumber = NO; 
     } 
    } 
    NSString *operation = [[sender titleLabel] text]; 
    NSNumber *result = [[Model singleton] performOperation:operation]; 
    [self.display setText:[NSString stringWithFormat:@"%@", result]]; 
} 

- (IBAction)clearDigitPressed:(UIButton *)sender { 

    [self.display setText:@""]; 
} 

- (IBAction)clearOperationPressed:(UIButton *)sender { 

    [[Model singleton] performOperation:nil]; 
    [self.display setText:@""]; 
} 

- (IBAction)changeNumeralType:(id)sender { 

    switch ([sender selectedSegmentIndex]) { 
     case 0: 
     {    
      [self.button1 setTitle:@"1" forState:UIControlStateNormal]; 
      [self.button2 setTitle:@"2" forState:UIControlStateNormal]; 
      [self.button3 setTitle:@"3" forState:UIControlStateNormal]; 
      [self.button4 setTitle:@"4" forState:UIControlStateNormal]; 
      [self.button5 setTitle:@"5" forState:UIControlStateNormal]; 
      [self.button6 setTitle:@"6" forState:UIControlStateNormal]; 
      [self.button7 setTitle:@"7" forState:UIControlStateNormal]; 
      [self.button8 setTitle:@"8" forState:UIControlStateNormal]; 
      [self.button9 setTitle:@"9" forState:UIControlStateNormal]; 
      [self.button0 setTitle:@"0" forState:UIControlStateNormal]; 
     } break; 

     case 1: 
     { 
      [self.button1 setTitle:@"L" forState:UIControlStateNormal]; 
      [self.button2 setTitle:@"C" forState:UIControlStateNormal]; 
      [self.button3 setTitle:@"D" forState:UIControlStateNormal]; 
      [self.button4 setTitle:@"I" forState:UIControlStateNormal]; 
      [self.button5 setTitle:@"V" forState:UIControlStateNormal]; 
      [self.button6 setTitle:@"X" forState:UIControlStateNormal]; 
      [self.button7 setTitle:@"" forState:UIControlStateNormal]; 
      [self.button8 setTitle:@"" forState:UIControlStateNormal]; 
      [self.button9 setTitle:@"" forState:UIControlStateNormal]; 
      [self.button0 setTitle:@"M" forState:UIControlStateNormal]; 

     } break; 

    } 
} 

- (BOOL)isValidForRoman:(NSString *)text 
{ 
    NSString *romanRegex = @"^(?=.)(?i)M*(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$"; 
    NSPredicate *romanTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", romanRegex]; 
    return ([romanTest evaluateWithObject:text]); 
} 
+1

那麼,除非你正在處理浮點羅馬數字,我會首先轉換爲「int」或「long」。 NSNumber是一個紅鯡魚。 –

+2

(並將羅馬數字轉換爲int/long是一項經典的家庭作業任務。) –

+0

我是Objective-c的新手,所以你能幫我把它轉換成長的嗎? –

回答

2

這裏有一些資源,可以幫助您:

Roman Numbers Convert - 這是一個兩個,因爲這可能是更好的已經向前/向後平移

pzearfoss/NSNumber-RomanNumerals - 這是一個簡單的類別;但是,它僅將NSNumber轉換爲羅馬數字。你也許可以調整它以反過來。

+0

RomanNumber有一個錯誤,其中IV == 6.我自己的錯誤使用一個庫,而沒有徹底測試它 – alexgophermix

1

你可以試試這個功能

-(NSString*)numberToRomanNumerals:(int)num{ 

    if (num < 0 || num > 9999) { return @""; } // out of range 



    NSArray *r_ones = [[NSArray alloc]initWithObjects:@"I", @"II", @"III", @"IV", @"V", @"VI", @"VII", @"VIII",@"IX",nil]; 
    NSArray *r_tens = [[NSArray alloc]initWithObjects:@"X", @"XX", @"XXX", @"XL", @"L", @"LX", @"LXX",@"LXXX", @"XC",nil]; 
    NSArray *r_hund = [[NSArray alloc]initWithObjects:@"C", @"CC", @"CCC", @"CD", @"D", @"DC", @"DCC",@"DCCC", @"CM",nil]; 
    NSArray *r_thou = [[NSArray alloc]initWithObjects:@"M", @"MM", @"MMM", @"MMMM", @"MMMMM", @"MMMMMM",@"MMMMMMM", 
       @"MMMMMMMM", @"MMMMMMMMM",nil]; 


    int ones = num % 10; 
    int tens = (num - ones) % 100; 
    int hundreds = (num - tens - ones) % 1000; 
    int thou = (num - hundreds - tens - ones) % 10000; 


    tens = tens/10; 
    hundreds = hundreds/100; 
    thou = thou/1000; 

    NSString *[email protected]""; 

    if (thou) { rnum = [rnum stringByAppendingString:[r_thou objectAtIndex:thou-1]]; } 
    if (hundreds) { rnum = [rnum stringByAppendingString:[r_hund objectAtIndex:hundreds-1]]; } 
    if (tens) { rnum = [rnum stringByAppendingString:[r_tens objectAtIndex:tens-1]]; } 
    if (ones) { rnum = [rnum stringByAppendingString:[r_ones objectAtIndex:ones-1]]; } 

    [r_ones release]; 
    [r_tens release]; 
    [r_hund release]; 
    [r_thou release]; 

    return rnum; 
} 
1

剛剛撰寫了一個,因爲我以前見過的一切是有點不可思議,所以歡迎您來嘗試:https://github.com/shoumikhin/RomanNumeral

//============================================================================== 
@implementation NSNumber (RomanNumeral) 
//------------------------------------------------------------------------------ 
- (NSString *)encodeRomanDigit:(NSInteger)value one:(NSString *)one five:(NSString *)five ten:(NSString *)ten 
{ 
    switch (value) 
    { 
     case 1 : 

      return [NSString stringWithFormat:@"%@", one]; 

     case 2 : 

      return [NSString stringWithFormat:@"%@%@", one, one]; 

     case 3 : 

      return [NSString stringWithFormat:@"%@%@%@", one, one, one]; 

     case 4 : 

      return [NSString stringWithFormat:@"%@%@", one, five]; 

     case 5 : 

      return [NSString stringWithFormat:@"%@", five]; 

     case 6 : 

      return [NSString stringWithFormat:@"%@%@", five, one]; 

     case 7 : 

      return [NSString stringWithFormat:@"%@%@%@", five, one, one]; 

     case 8 : 

      return [NSString stringWithFormat:@"%@%@%@%@", five, one, one, one]; 

     case 9 : 

      return [NSString stringWithFormat:@"%@%@", one, ten]; 
    } 

    return @""; 
} 
//------------------------------------------------------------------------------ 
- (NSString *)encodeRomanDigit:(NSInteger)value withDigitNumber:(NSUInteger)digitPosition 
{ 
    switch (digitPosition) 
    { 
     case 0 : 

      return [self encodeRomanDigit:value one:@"I" five:@"V" ten:@"X"]; 

     case 1 : 

      return [self encodeRomanDigit:value one:@"X" five:@"L" ten:@"C"]; 

     case 2 : 

      return [self encodeRomanDigit:value one:@"C" five:@"D" ten:@"M"]; 

     case 3 : 

      return [self encodeRomanDigit:value one:@"M" five:@"" ten:@""]; 
    } 

    return @""; 
} 
//------------------------------------------------------------------------------ 
- (NSString *)romanNumeralStringValue 
{ 
    NSMutableString *ret = @"".mutableCopy; 
    NSUInteger value = self.unsignedIntegerValue; 
    NSUInteger base = 10; 
    NSUInteger digitPosition = 0; 
    NSUInteger const ROMAN_NUMBER_MAX = 4000; 

    if (value < ROMAN_NUMBER_MAX) 
     do 
     { 
      [ret insertString:[self encodeRomanDigit:value % base withBase:digitPosition] atIndex:0]; 
      digitPosition++; 
     } 
     while (value /= base); 

    return ret; 
} 
//------------------------------------------------------------------------------ 
@end 
//============================================================================== 
@implementation NSString (RomanNumeral) 
//------------------------------------------------------------------------------ 
- (NSInteger)decodeRomanDigit:(char)romanDigit 
{ 
    switch (romanDigit) 
    { 
     case 'I' : 
     case 'i' : 

      return 1; 

     case 'V' : 
     case 'v' : 
     case 'U' : 
     case 'u' : 

      return 5; 

     case 'X' : 
     case 'x' : 

      return 10; 

     case 'L' : 
     case 'l' : 

      return 50; 

     case 'C' : 
     case 'c' : 

      return 100; 

     case 'D' : 
     case 'd' : 

      return 500; 

     case 'M' : 
     case 'm' : 

      return 1000; 
    } 

    return 0; 
} 
//------------------------------------------------------------------------------ 
- (NSInteger)romanNumeralValue 
{ 
    NSInteger ret = 0; 
    NSUInteger length = self.length; 
    unichar buffer[length]; 

    [self getCharacters:buffer range:NSMakeRange(0, length)]; 

    for (int i = 0; i < length; ++i) 
    { 
     NSInteger current = [self decodeRomanDigit:buffer[i]]; 
     NSInteger next = i + 1 < length ? [self decodeRomanDigit:buffer[i + 1]] : 0; 

     if (next > current) 
     { 
      ret += next - current; 
      i++; 
     } 
     else 
      ret += current; 
    } 

    return ret; 
} 
//------------------------------------------------------------------------------ 
@end 
//============================================================================== 
+0

不像批准的答案這個實際上工作。謝謝! – alexgophermix