使用 NSNumberFormatter 生成小数点后尾随零的数字

     2023-04-14     23

关键词:

【中文标题】使用 NSNumberFormatter 生成小数点后尾随零的数字【英文标题】:Using NSNumberFormatter to generate number with trailing zeros after decimal 【发布时间】:2014-10-28 05:57:44 【问题描述】:

在 Swift 中,您将如何创建一个 NSNumberFormatter 来保留小数点 (12.000) 后的尾随零,同时生成适合当前语言环境的数字?

我当前的代码和示例输出:

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。

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

【问题讨论】:

一个 number 没有尾随零,只有它的 string 表示。 "12.0" 和 "12.000" 转换为 数字 给出完全相同的结果,并且无法将它们区分为数字。 – 为什么不能只使用字符串本身? @Martin 因为字符串始终为英文格式,并且输出数字需要遵守当前的语言环境,但如果字符串中存在尾随零,则还要保留它们。 然后您可以转换字符串->数字->字符串,但您必须计算尾随零的数量并将其设置为 minimum+maximumFractionDigits 以进行第二次转换。也许这有帮助,目前没有时间尝试并写一个答案。 【参考方案1】:

正如 Martin R 所提到的,您可以将 minimumFractionDigitsmaximumFractionDigits 设置为相同的数字,这将强制始终显示许多小数位数。要知道要显示多少,您需要在小数点后取一个子字符串到末尾并计算其元素。为了知道是否所有小数位都是 0,我创建了一个辅助方法,该方法将该子字符串转换为一个数字,如果它等于 0,那么你就知道它们都是 0。

不幸的是,您需要根据原始字符串编号使用几个不同的NSNumberFormatters 将字符串转换为本地化编号。因此,如果它确实包含小数,并且它之后的所有内容都是 0,那么您需要创建一个不同的格式化程序,将字符串转换为数字,然后将该数字转换为字符串,以便根据用户的语言环境显示它。否则,您可以使用原始数字格式化程序。

【讨论】:

【参考方案2】:

此功能可满足您的要求。从语言环境(例如 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;

【讨论】:

NSNumberFormatter 仅四舍五入到小数点后 3 位

】NSNumberFormatter仅四舍五入到小数点后3位【英文标题】:NSNumberFormatteronlyroundsto3decimalplaces【发布时间】:2009-05-0104:15:26【问题描述】:我正在尝试在iPhone应用程序中使用NSNumberFormatter将数字四舍五入到小数点后5位,但[formatterstri... 查看详情

NSNumberFormatter 用于 2 个小数位

】NSNumberFormatter用于2个小数位【英文标题】:NSNumberFormatterfor2DecimalPlaces【发布时间】:2021-02-2311:59:49【问题描述】:我有一些想要以本地样式显示的数量。NSNumberFormatter*numberFormatter=[[NSNumberFormatteralloc]init];numberFormatter.locale=[NSLoca... 查看详情

NSNumberformatter 将零添加到小数部分

】NSNumberformatter将零添加到小数部分【英文标题】:NSNumberformatteraddzerostodecimalpart【发布时间】:2018-07-0422:15:18【问题描述】:我正在寻找一种显示以下内容的方法:"20000.5"=>"20,000.50""20000"=>"20,000.00"所以基本上总是两位小数... 查看详情

NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符

】NSNumberFormatter适用于小数分隔符但不适用于逗号分隔符【英文标题】:NSNumberFormatterworkswithdecimalseparatorbutnotwithcommaseparator【发布时间】:2011-09-0800:32:13【问题描述】:我已经为此工作了两天。是时候咨询***了。我有一个iOS用户... 查看详情

带有数字样式的 NSNumberFormatter NSNumberFormatterCurrencyStyle 逗号问题

】带有数字样式的NSNumberFormatterNSNumberFormatterCurrencyStyle逗号问题【英文标题】:NSNumberFormatterwithnumberstyleNSNumberFormatterCurrencyStyletroublewithcommas【发布时间】:2014-09-0713:06:30【问题描述】:我正在尝试正确处理某些项目的投入费用。... 查看详情

在iOS中找出货币中的小数位数

...yiniOS【发布时间】:2012-09-0215:35:02【问题描述】:我使用NSNumberFormatter以本地化方式格式化货币,它工作正常。但我想覆盖它并让用户选择覆盖小数分隔符后的位数。如何找出NSNumberFormatter将用于某种货币的位数?我查看了NSLocale... 查看详情

使用 NSNumberFormatter 将数字转换为格式

】使用NSNumberFormatter将数字转换为格式【英文标题】:ConvertingnumbertoformatwithNSNumberFormatter【发布时间】:2014-11-2710:40:48【问题描述】:如何使用NSNumberFormatter将4273095782等数字转换为数字4273095782?我用了这个二极管,但没有得到它... 查看详情

nsnumberformatter

...;====//四舍五入的整数NSString*numberNoStyleStr=[NSNumberFormatterlocalizedStringFromNumber:num1numberStyle:NSNumberFormatterNoStyle];//小数形式NSString*numberDecimalStyleStr=[NSNumberFormatterlocalizedStringFromNumber:num1numberStyle:NSNumberFormatterDecimalStyle];... 查看详情

nsnumberformatter

...;====//四舍五入的整数NSString*numberNoStyleStr=[NSNumberFormatterlocalizedStringFromNumber:num1numberStyle:NSNumberFormatterNoStyle];//小数形式NSString*numberDecimalStyleStr=[NSNumberFormatterlocalizedStringFromNumber:num1numberStyle:NSNumberFormatterDecimalStyle];... 查看详情

计算中的小数点为。要么,(代码片段)

...,”使用户根据区域格式感到舒服。另一答案你应该使用NSNumberFormatter,因为这可以设置为处理不同的语言环境。创建格式化程序:NSNumberFormatter*numberFormatter=[[NSNumberFormatteralloc]init];[numberFormattersetLocale:[NSLocalecurrentLocale]];用它:NS... 查看详情

使用 NSNumberFormatter 循环中的 Objective C 自动释放

】使用NSNumberFormatter循环中的ObjectiveC自动释放【英文标题】:ObjectiveCAutoreleaseinaloopwithNSNumberFormatter【发布时间】:2012-04-0916:35:42【问题描述】:我正在尝试格式化数字数组以在循环中显示在CCLabelTTF数组中。NSNumberFormatter返回一... 查看详情

在 iphone sdk 中使用 NSNumberFormatter 和 NSDecimalNumberHandler

】在iphonesdk中使用NSNumberFormatter和NSDecimalNumberHandler【英文标题】:usingNSNumberFormatterwithNSDecimalNumberHandlerintheiphonesdk【发布时间】:2009-07-1002:02:26【问题描述】:作为我正在做的格式化非常大、精确的数字的快速测试:(数字是合... 查看详情

NSNumberformatter 添加额外的零

】NSNumberformatter添加额外的零【英文标题】:NSNumberformatteraddextrazero【发布时间】:2012-06-2104:23:19【问题描述】:我正在寻找一种将“1”显示为“01”的方法,所以基本上10以下的所有内容都应该有一个前导0。最好的方法是什么... 查看详情

NSNumberFormatter 货币符号

】NSNumberFormatter货币符号【英文标题】:NSNumberFormattercurrencysymbol【发布时间】:2014-07-1418:08:26【问题描述】:我的应用程序允许用户选择各种货币来跟踪支出。我有一个标签,显示带有货币符号的金额。我正在使用NSNumberFormatter... 查看详情

在 Swift 中使用 NSNumberFormatter 格式化货币输入

】在Swift中使用NSNumberFormatter格式化货币输入【英文标题】:FormattinginputforcurrencywithNSNumberFormatterinSwift【发布时间】:2014-07-2516:47:42【问题描述】:我正在创建一个预算应用程序,允许用户输入他们的预算以及交易。我需要允许... 查看详情

NSNumberFormatter - 获取货币代码的货币符号

】NSNumberFormatter-获取货币代码的货币符号【英文标题】:NSNumberFormatter-getcurrencysymbolforcurrencycode【发布时间】:2021-05-1223:46:36【问题描述】:这个问题类似于,但没有适用于该问题的答案-NSNumberFormattercurrencysymbol我正在使用NSNumber... 查看详情

numberFromString 的 NSNumberFormatter 问题

】numberFromString的NSNumberFormatter问题【英文标题】:NSNumberFormatterissuewithnumberFromString【发布时间】:2013-10-1408:44:28【问题描述】:我在NSString上有一个使用这种方法的类别:-(NSNumber*)numberValueif(!nfStr)nfStr=[[NSNumberFormatteralloc]init];NSLoca... 查看详情

使用 NSNumberFormatter 和 RestKit 将 NSCFNumber 转换为 NSNumber 时出错

】使用NSNumberFormatter和RestKit将NSCFNumber转换为NSNumber时出错【英文标题】:ErrorprintingNSCFNumbercastasNSNumberusingNSNumberFormatterandRestKit【发布时间】:2012-12-0523:14:59【问题描述】:我正在尝试从JSON调用中打印/访问我的(双)值并获取:[... 查看详情