标签: nsnumberformatter

如何在iOS上格式化和打印浮点数?

我想创建一个浮点数的格式化输出,并在Cocoa-Touch上进行正确的本地化.输出应该等于printf("%<a>.<b>f", n),其中<a>是总位数,<f>最大小数位数.

NSNumberFormatter使用<a>=6和设置<f>=2 :(平台是iOS 5.1 SDK,Xcode 4.3.3和iPhone模拟器5.1)

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterDecimalStyle];
[nf setPaddingCharacter:@" "];
[nf setUsesGroupingSeparator:NO];
[nf setLocale:[NSLocale autoupdatingCurrentLocale]];
[nf setUsesSignificantDigits:YES];
[nf setMaximumSignificantDigits:6];
[nf setMaximumFractionDigits:2];
[nf setRoundingMode:NSNumberFormatterRoundFloor];
NSLog(@"Test: %@", [nf stringFromNumber:[NSNumber numberWithDouble:2.64324897]]);
Run Code Online (Sandbox Code Playgroud)

预期输出(使用德语区域设置):Test: 2,64

观察到的输出(使用德语语言环境):Test: 2,64324

其他观察:我试图对小数位数使用不同的值,例如[nf setMaximumFractionDigits:4][nf setMaximumFractionDigits:0].结果未更改,似乎忽略了小数位.将区域设置更改为仅更改,为a .,而不是小数位数.

问题:如何将printf-format字符串正确转换为NSNumberFormatter

cocoa-touch nsnumberformatter

5
推荐指数
1
解决办法
9731
查看次数

将长NSString转换为NSNumber

我无法可靠地将更长时间转换NSStringNSNumber.具体来说,我将MPMediaEntityPropertyPersistentID字符串转换为NSNumber 有时它有效,通常不会.

转换代码:

 NSString *keke = [jsonArray objectForKey:@"next"];
 NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
 [f setNumberStyle:NSNumberFormatterDecimalStyle];
 NSNumber *persistentIDasNumber = [f numberFromString:keke];
Run Code Online (Sandbox Code Playgroud)

以下是成功进行数字转换的示例:

String: 3813955856659208324
Number: 3813955856659208324
Run Code Online (Sandbox Code Playgroud)

这是一个不成功的转换:

String: 12790162104953153719 
Number:1.279016210495315e+19
Run Code Online (Sandbox Code Playgroud)

它很接近,但最后发生了什么?它太大了吗?

objective-c nsnumberformatter ios

5
推荐指数
1
解决办法
2575
查看次数

将千位分隔符"˙"添加到浮点数

我正在使用从0.00到9999.99的数字范围.我需要添加"˙"千位分隔符,所以1300,00应该成为1?300,00.NSNumberFormatter使用","作为分隔符,因此对我不利.

我试过用

func formatNumber (i: Float) -> String {
    var counter = 0
    var correctedNumber = ""

    if i > 999 {
        for char in "\(i)".characters {
            if counter == 1 {
                correctedNumber += "?" + "\(char)"
            } else {
                correctedNumber += "\(char)"
            }

            counter++
        }
    } else {
        correctedNumber = "\(i)"
    }

    return correctedNumber
}
Run Code Online (Sandbox Code Playgroud)

但它不能格式化十进制数字.

这样做的正确方法是什么?

string nsnumber nsnumberformatter ios swift

5
推荐指数
1
解决办法
888
查看次数

拼出序数词

有几种方法可以使用NSNumberFormatter(从 iOS 9 开始)或第三方(如FormatterKit.

还有一种拼写基数的方法,NSNumberFormatter给出one, two, three

但是,我需要获得未缩写的拼写 - first, second, third

我知道 iOS 内部可以做到这一点,因为如果我将“1st”传递给AVSpeechUtterance它,它就会将其发音为“first”。我想知道是否有任何 API 可以获取带有序数拼写的字符串,最好是针对多种语言?

nsnumberformatter ios

5
推荐指数
1
解决办法
1555
查看次数

NumberFormatter:允许“,”和“.” 作为小数点分隔符

我用来NumberFormatter格式化和验证用户的货币输入。由于有些人正在使用,而其他人则.与所选区域设置无关,因此我希望在处理输入时将这两个符号视为小数分隔符(即格式化 a Stringto Number)。

我怎样才能实现这个目标?

我当前的NumberFormatter配置如下:

    private lazy var currencyFormatter: NumberFormatter = {
        let currencyFormatter = NumberFormatter()
        currencyFormatter.numberStyle = .currency
        currencyFormatter.locale = Locale.autoupdatingCurrent
        currencyFormatter.currencySymbol = ""
        currencyFormatter.maximumFractionDigits = 2
        currencyFormatter.minimumFractionDigits = 2
        return currencyFormatter
    }()
Run Code Online (Sandbox Code Playgroud)

我应该使用多个格式化程序来实现我想要的结果吗?

结果

我希望拥有数字5,34并被5.34视为有效并转换为适当的NSNumber. 但是,我仍然希望能够以5.34lksdfns无效为由拒绝。

foundation numberformatter nsnumberformatter ios swift

5
推荐指数
0
解决办法
1905
查看次数

使用环境区域设置时出现 SwiftUI 预览问题

我正在使用一个简单的视图来显示文本NumberFormatter我正在使用一个简单的视图来显示特定区域

\n\n
struct CurrencyView: View {\n    let currency:Currency\n    var body: some View {\n        Text(currency.getFormattedCurrency())\n    }\n}\n\nstruct CurrencyView_Previews: PreviewProvider {\n    static var previews: some View {\n        CurrencyView(currency: Currency(currencyValue: 1.0)).previewLayout(.fixed(width: 300.0, height: 55.0)).environment(\\.locale, .init(identifier: "fr_Fr"))\n    }\n}\n\nstruct Currency{\n    let currencyValue:Double\n\n    func getFormattedCurrency() -> String{\n        let formatter = NumberFormatter()\n        formatter.numberStyle = .currency\n        let formatterCurrency =  formatter.string(for: self.currencyValue) ?? ""\n        return formatterCurrency\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我预计预览会显示货币French\xe2\x82\xac 中的货币,正如我在预览中的区域设置中提到的那样。

\n

localization nsnumberformatter swiftui

5
推荐指数
1
解决办法
1742
查看次数

setMaximumFractionDigits的问题

setMaximumFractionDigits不能使用以下代码.

NSString *input=@"80.90";
NSNumberFormatter *numberFormatter=[[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:2];
NSNumber *number=[numberFormatter numberFromString:input];
Run Code Online (Sandbox Code Playgroud)

数字转换为80.90000000000001.但我限制了2位小数.那么,我如何得到80.90而不是80.90000000000001

objective-c fractions nsnumberformatter ios

4
推荐指数
1
解决办法
3931
查看次数

NSNumberFormatter在设备上返回nil,而不是在模拟器上返回

我使用NSNumberFormatter将用户输入转换为NSNumber(十进制数),我使用ARC.

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
[f setMaximumFractionDigits:1];

_myNumber = [f numberFromString:myTextField.text];
Run Code Online (Sandbox Code Playgroud)

有时,这会导致_myNumbernil.即使我绝对确定用户输入的是正确的十进制数(我在调试期间检查过).

为了完整性:_myNumber是ViewController的综合属性.这仅在设备上运行应用程序时发生,而不是在我在模拟器中运行时.使用的键盘是'Decimal Pad'在不同的代码段中,在不同的ViewController中代码可以正常工作.

我现在有一个解决方法,我在上面的代码下面添加了:

if (!myNumber){
    myNumber = [NSNumber numberWithFloat: myTextField.text.floatValue];
}
Run Code Online (Sandbox Code Playgroud)

有人知道为什么NSNumberFormatter可以返回nil,即使在调用时也是如此[NSNumber numberWithFloat: myTextField.text.floatValue]

null decimal nsnumberformatter ios

4
推荐指数
1
解决办法
1735
查看次数

新的iOS9/OSX10.11 NSNumberFormatterStyle枚举值是什么意思?

iOS和OS X NSNumberFormatterStyle枚举使用新的iOS 9和OS X 10.11 SDK获得了4个新值!它们听起来很酷且很有用,但Apple的文档,甚至谷歌都没有什么可说的!

传递给公式时这些新值的作用是什么,它们与旧值有什么不同?


在iOS 9.0或OS X 10.11中>框架>基础> NSNumberFormatter.h第46-57行:

typedef NS_ENUM(NSUInteger, NSNumberFormatterStyle) {
    NSNumberFormatterNoStyle = kCFNumberFormatterNoStyle,
    NSNumberFormatterDecimalStyle = kCFNumberFormatterDecimalStyle,
    NSNumberFormatterCurrencyStyle = kCFNumberFormatterCurrencyStyle,
    NSNumberFormatterPercentStyle = kCFNumberFormatterPercentStyle,
    NSNumberFormatterScientificStyle = kCFNumberFormatterScientificStyle,
    NSNumberFormatterSpellOutStyle = kCFNumberFormatterSpellOutStyle,
    NSNumberFormatterOrdinalStyle NS_ENUM_AVAILABLE(10_11, 9_0) = kCFNumberFormatterOrdinalStyle,
    NSNumberFormatterCurrencyISOCodeStyle NS_ENUM_AVAILABLE(10_11, 9_0) = kCFNumberFormatterCurrencyISOCodeStyle,
    NSNumberFormatterCurrencyPluralStyle NS_ENUM_AVAILABLE(10_11, 9_0) = kCFNumberFormatterCurrencyPluralStyle,
    NSNumberFormatterCurrencyAccountingStyle NS_ENUM_AVAILABLE(10_11, 9_0) = kCFNumberFormatterCurrencyAccountingStyle,
};
Run Code Online (Sandbox Code Playgroud)

cocoa enums cocoa-touch foundation nsnumberformatter

4
推荐指数
1
解决办法
598
查看次数

Swift - 使用逗号分隔符加倍的字符串

我目前有一个这样的字符串:"8,0"或者"4,25"我需要将其转换为a Double,但我该怎么做?难道我首先更换,.

我已经看了,NSNumberFormatternil每个字符串都返回了.

let formatter = NSNumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let grade = formatter.numberFromString(grade["Cijfer"].stringValue)
print(grade)
Run Code Online (Sandbox Code Playgroud)

我该怎么用?

string double nsnumberformatter swift2

4
推荐指数
2
解决办法
5665
查看次数