2014-10-28 4 views
0

Swift에서 자국어 로캘에 적합한 숫자를 생성하면서 십진수 (12.000) 뒤에 후행 0을 유지하는 NSNumberFormatter을 어떻게 만들 수 있습니까?NSNumberFormatter를 사용하여 십진수 뒤에 후행 숫자가있는 숫자 생성

내 현재 코드 예 출력 :

let formatter = NSNumberFormatter() 
formatter.numberStyle = .DecimalStyle 
formatter.locale = NSLocale.currentLocale() 
formatter.maximumFractionDigits = 10 

var doubleNumString = "12.0" 
println(formatter.numberFromString(doubleNumString)) //in English it prints 12, want it to print 12.0 

var doubleNumString = "12.000" 
println(formatter.numberFromString(doubleNumString)) //prints 12, want it to print 12.000 

var doubleNumString = "12.125" 
println(formatter.numberFromString(doubleNumString)) //prints 12.125 as expected 

var doubleNumString = "1234" 
println(formatter.numberFromString(doubleNumString)) //prints 1,234 as expected 

은 이미 코딩 한 그와 같은 문자열이 소수 ("12.")에서 끝나는 경우 다음 숫자를 생성하기 위해이 포맷을 사용하지 않습니다 것 그 대신 십진수를 표시하십시오 (그러나 일부 언어는 오른쪽에서 왼쪽으로 읽으므로이를 향상시켜야합니다).

한 가지 해결책은 문자열에 마침표가 포함되어 있는지 확인하고 그 뒤에 오는 숫자가 모두 0인지 확인한 다음 숫자 서식 지정 프로그램을 통해 실행하고 대신 int 값만 실행하는 것입니다 포맷터를 통해 10 진수 다음에 적절한 수의 0을 추가/앞에 추가하십시오.

더 나은/더 좋은 솔루션이 있습니까?

+1

A * 번호 동일 패스. * 숫자로 변환 된 "12.0"과 "12.000"은 똑같은 결과를 나타내며 숫자로 구별 할 방법이 없습니다. 왜 그냥 문자열 자체를 사용할 수 없습니까? –

+0

@Martin 문자열은 항상 영어 형식이므로 출력 번호는 현재 로캘을 고려해야하며 문자열에있는 경우 후행 0도 유지해야하기 때문입니다. – Joey

+1

그러면 string-> number-> string을 변환 할 수 있지만 후행 0의 수를 세고 두 번째 변환의 minimum + maximumFractionDigits로 설정해야합니다. 아마도 도움이 될 것입니다. 시도해 볼 시간이없고 현재 답변을 작성하십시오. –

답변

1

Martin R이 언급했듯이 많은 숫자가 항상 표시되도록 동일한 번호로 minimumFractionDigitsmaximumFractionDigits을 설정할 수 있습니다. 얼마나 많은 것을 표시해야하는지 알기 위해서는 십진수 다음에 하위 문자열을 가져 와서 그 요소를 계산해야합니다. 모든 소수 자릿수가 0인지 아닌지를 알기 위해 하위 문자열을 숫자로 변환하는 도우미 메서드를 만들었고 0이면 모두 0임을 알았습니다.

불행히도 원래 문자열 번호에 따라 NSNumberFormatter 개의 다른 문자를 사용하여 문자열을 현지화 된 숫자로 변환해야합니다. 그래서 그것이 10 진수를 포함하고 0을 포함한다면 다른 포맷터를 만들고 문자열을 숫자로 변환 한 다음 그 숫자를 문자열로 변환하여 사용자의 로케일을 존중하도록 표시해야합니다. 그렇지 않으면 원래 숫자 형식기를 사용할 수 있습니다.

-1

이 기능은 요구 사항을 처리합니다. 에만 * * 문자열 표현 * 후미 제로없는 로케일 & (예컨대 ko 페이지)

+ (NSString*) stringForString:(NSString*) string forLocale:(NSString*) toLocaleCode fromLocal:(NSString*) fromLocaleCode { 

    NSLocale *fromLocale = [[NSLocale alloc] initWithLocaleIdentifier:fromLocaleCode]; 
    NSNumberFormatter *sourceFormatter = [[NSNumberFormatter alloc] init]; 
    [sourceFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    [sourceFormatter setUsesGroupingSeparator:NO]; 
    [sourceFormatter setLocale:fromLocale]; 
    NSNumber *localizedNumber = [sourceFormatter numberFromString:string]; 

    if (!localizedNumber) { 
     return string; 
    } 

    NSLocale *toLocale = [[NSLocale alloc] initWithLocaleIdentifier:toLocaleCode]; 

    NSNumberFormatter *destinationFormatter = [[NSNumberFormatter alloc] init]; 
    [destinationFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    [destinationFormatter setUsesGroupingSeparator:NO]; 
    [destinationFormatter setLocale:toLocale]; 
    NSString *localizedString = [destinationFormatter stringFromNumber:localizedNumber]; 

    //add the zeros which were dropped because of the sourceDecimalString number conversion e.g. 0.20 is converted to 0.2 

    if (localizedString.length < string.length) { 
     NSRange rangeOfDecimal = [string rangeOfString:sourceFormatter.decimalSeparator]; 
     if (rangeOfDecimal.location != NSNotFound) { 
      NSString* sourceDecimalString = [string substringFromIndex:rangeOfDecimal.location]; 


      rangeOfDecimal = [localizedString rangeOfString:destinationFormatter.decimalSeparator]; 
      if (rangeOfDecimal.location != NSNotFound) { 
       NSString* destinationDecimalString = [localizedString substringFromIndex:rangeOfDecimal.location]; 

       if (destinationDecimalString.length < sourceDecimalString.length) { 
        int difference = sourceDecimalString.length - destinationDecimalString.length; 
        int toalDecimalDigits = (destinationDecimalString.length - 1) + difference; //-1 to remove '.' 

        destinationFormatter.minimumFractionDigits = toalDecimalDigits; 
        destinationFormatter.maximumFractionDigits = toalDecimalDigits; 

        localizedString = [destinationFormatter stringFromNumber:localizedNumber]; 
       } 
      } 
      else{//this indicates no decimal separator in the return string 
       int toalDecimalDigits = (sourceDecimalString.length - 1); //-1 to remove '.' 

       destinationFormatter.minimumFractionDigits = toalDecimalDigits; 
       destinationFormatter.maximumFractionDigits = toalDecimalDigits; 

       localizedString = [destinationFormatter stringFromNumber:localizedNumber]; 
      } 

     } 
    } 

    return localizedString; 
}