我想创建一个浮点数的格式化输出,并在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?
我无法可靠地将更长时间转换NSString为NSNumber.具体来说,我将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)
它很接近,但最后发生了什么?它太大了吗?
我正在使用从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)
但它不能格式化十进制数字.
这样做的正确方法是什么?
有几种方法可以使用NSNumberFormatter(从 iOS 9 开始)或第三方(如FormatterKit.
还有一种拼写基数的方法,NSNumberFormatter给出one, two, three。
但是,我需要获得未缩写的拼写 - first, second, third。
我知道 iOS 内部可以做到这一点,因为如果我将“1st”传递给AVSpeechUtterance它,它就会将其发音为“first”。我想知道是否有任何 API 可以获取带有序数拼写的字符串,最好是针对多种语言?
我用来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无效为由拒绝。
我正在使用一个简单的视图来显示文本NumberFormatter我正在使用一个简单的视图来显示特定区域
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}\nRun Code Online (Sandbox Code Playgroud)\n\n我预计预览会显示货币French\xe2\x82\xac 中的货币,正如我在预览中的区域设置中提到的那样。
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
我使用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)
有时,这会导致_myNumber要nil.即使我绝对确定用户输入的是正确的十进制数(我在调试期间检查过).
为了完整性:_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]?
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) 我目前有一个这样的字符串:"8,0"或者"4,25"我需要将其转换为a Double,但我该怎么做?难道我首先更换,了.?
我已经看了,NSNumberFormatter但nil每个字符串都返回了.
let formatter = NSNumberFormatter()
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
let grade = formatter.numberFromString(grade["Cijfer"].stringValue)
print(grade)
Run Code Online (Sandbox Code Playgroud)
我该怎么用?
ios ×6
cocoa-touch ×2
foundation ×2
objective-c ×2
string ×2
swift ×2
cocoa ×1
decimal ×1
double ×1
enums ×1
fractions ×1
localization ×1
nsnumber ×1
null ×1
swift2 ×1
swiftui ×1