2014-10-28 81 views
0

在Swift中,如何创建一个NSNumberFormatter来保留小数点后的零(12.000),同时还生成适合当前语言环境的数字?使用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值通过格式化程序,然后附加/预先加上小数,然后加上适当数量的0。

是否有更好的/更清洁的解决方案?

+1

A *编号*不具有尾随零,只有其* *字符串表示。将“12.0”和“12.000”转换为*号*给出完全相同的结果,并且无法将它们区分为数字。 - 为什么你不能只使用字符串本身? – 2014-10-28 06:13:45

+0

@Martin,因为字符串始终为英文格式,并且输出数字需要尊重当前语言环境,但如果它们存在于字符串中,则还会保留任何尾随零。 – Joey 2014-10-28 06:22:25

+1

然后你可以转换string-> number-> string,但是你必须计算尾随零的数量并将其设置为第二次转换的minimum + maximumFractionDigits。也许这有帮助,现在没有时间去尝试并写出答案。 – 2014-10-28 06:31:58

回答

1

正如Martin R所述,您可以将minimumFractionDigitsmaximumFractionDigits设置为相同的数字,这将强制显示许多小数位。要知道需要显示多少个字符,需要在小数点后面接一个子字符串并计算其元素。要知道是否所有的小数位都是0,我创建了一个帮助器方法,将该子串转换为数字,如果它等于0,则知道它们全为0。

不幸的是,您需要根据原始字符串编号,使用不同的NSNumberFormatter s将字符串转换为本地化号码。因此,如果它包含一个小数,并且其后的所有内容都是0,那么您需要创建一个不同的格式化程序,将该字符串转换为数字,然后将该数字转换为字符串以便根据用户的区域设置进行显示。否则,您可以使用您的原始数字格式器。

-1

此功能照顾您的要求。通过同为&从区域设置(例如EN_US)

+ (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; 
} 
相关问题