我需要最有效地在有限宽度的区域中打印浮点值.我正在使用一个NSNumberFormatter,并且我将小数点后面的两个数字设置为默认值,这样当我有一个像234.25它的数字一样打印时:234.25.但是当我有1234.25我希望它打印为:1234.3,并且 11234.25应该打印11234.
我需要在该点后最多两位数,如果我在该点之后有数字,则最多总共五位数,但如果整数部分有更多,则还应打印超过五位数.
我看不到限制总位数的能力NSNumberFormatter.这是否意味着我应该用这种方式编写自己的函数来格式化数字?如果是这样,那么获取数字的整数和小数部分中的数字位数的正确方法是什么?我也更喜欢使用CGFLoat,而不是NSNumber避免额外的类型转换.
我想将我的号码格式化为货币字符串.这些是以下情况
25.00 => $25
25.43 => $25.43
25.4 => $25.40
0.00 -> $0
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点NSNumberFormatter?
这是我现在的代码:
NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
[fmt setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmt setCurrencyCode:@"USD"];
Run Code Online (Sandbox Code Playgroud)
然而,我的第一个和最后一个例子失败了.
我也尝试过:
NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
[fmt setPositiveFormat:@"$0.##"];
Run Code Online (Sandbox Code Playgroud)
然而,我的第三个案件失败了.有什么建议?
在我看来,任何有效数字也可以表示为a String,所以我不知道为什么这个函数返回a String?而不是a String.
Xcode 8.0(8A218a)GM
目标:iOS 10(Swift 3)
请考虑以下代码:
let number = NSDecimalNumber(decimal: 22.4)
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.locale = Locale.current
let result = numberFormatter.string(from: number)
print(result!)
Run Code Online (Sandbox Code Playgroud)
结果是:
¤22.40
Run Code Online (Sandbox Code Playgroud)
(我不知道是什么¤意思.)
但是,如果我初始化语言环境,例如:
numberFormatter.locale = Locale(identifier: "en_US")
Run Code Online (Sandbox Code Playgroud)
结果将是:
$22.40
Run Code Online (Sandbox Code Playgroud)
......这首先是我所期待的.
请注意,这适用于Playground:
问题似乎只发生在通过Xcode启动的设备/模拟器上.
(我在两个不同的macOS上测试 - 在我的工作场所和家中.)
关于发生了什么的任何想法?
我在这个例子中转换NSNumber为NSString假设所选择的键"theindex"是1000000
NSNumber *firstNumber = [tempDict objectForKey:@"theindex"];
NSString *convertNumber = [firstNumber stringValue];
Run Code Online (Sandbox Code Playgroud)
回归NSString"1000000"
我希望字符串的值为"1,000,000".
我不关心本地化,但从其他NSNumberFormatter应该实现的问题中理解.我不知道怎么做到这一点?
我想将数字转换为更短的形式NSNumberFormatter.
例如:从23000到23K.
我怎么能用它NSNumberFormatter?
我知道可以自己做计算,但就我而言,这是不正确的方法.
简单地说,我有一个正整数[9,393,3,993],我想将它本地化为某种语言[9,393,3,939].
如果我使用NSNumberFormatter,它将根据用户的语言环境本地化数字.但是,我想覆盖它并选择任何语言环境来将数字转换为.
我尝试以下,并没有工作:
// user locale is @"en"
NSNumberFormatter* formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterNoStyle];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ar"]];
[formatter setMinimumIntegerDigits:padding];
return [formatter stringFromNumber:@(num)];
Run Code Online (Sandbox Code Playgroud)
返回的字符串是英文的.
请注意,我有一个非常相似的代码片段NSDateFormatter,但它按预期工作.该NSDateFormatter对象尊重设置的区域设置.
我试图从带有货币符号的字符串中获取数字(浮点值).
例如.从"¥1,234"到1234从"AU $ 3,456"到3456从"56.78€"到56.78
我尝试了以下代码,但结果是0.
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setLenient:YES];
NSNumber *number = [formatter numberFromString:text];
NSDecimalNumber *money = [NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]];
float fval = [money floatValue];
Run Code Online (Sandbox Code Playgroud)
提前致谢!
如果可能的话,我想将我的大数字从100,000改为$ 100K.
这是我到目前为止:
let valueFormatter = NSNumberFormatter()
valueFormatter.locale = NSLocale.currentLocale()
valueFormatter.numberStyle = .CurrencyStyle
valueFormatter.maximumFractionDigits = 0
Run Code Online (Sandbox Code Playgroud)
使用NSNumberFormatter,我如何输出$ 100K而不是$ 100,000?
我原来的问题:
这是我到目前为止:
self.lineChartView.leftAxis.valueFormatter = NSNumberFormatter()
self.lineChartView.leftAxis.valueFormatter?.locale = NSLocale.currentLocale()
self.lineChartView.leftAxis.valueFormatter?.numberStyle = .CurrencyStyle
self.lineChartView.leftAxis.valueFormatter?.maximumFractionDigits = 0
Run Code Online (Sandbox Code Playgroud)
其中翻译为:
let valueFormatter = NSNumberFormatter()
valueFormatter.locale = NSLocale.currentLocale()
valueFormatter.numberStyle = .CurrencyStyle
valueFormatter.maximumFractionDigits = 0
Run Code Online (Sandbox Code Playgroud)
我的输出如下:
使用NSNumberFormatter,我如何输出$ 100K而不是$ 100,000?
更新:
我想提供有关最新情况的背景,观看评论.
func setDollarsData(months: [String], range: Double) {
var dataSets: [LineChartDataSet] = [LineChartDataSet]()
var yVals: [ChartDataEntry] = [ChartDataEntry]()
for var i = 0; i < months.count; i++ …Run Code Online (Sandbox Code Playgroud) 我正在尝试在iOS应用中格式化货币值,并且正在使用设备上的当前“语言环境”设置来使用适当的货币格式。
在模拟器中,一切似乎运行良好:使用时currencyFormatter.locale = Locale.current,它将采用正确的语言环境设置并以正确的货币格式打印数字。
但是,在我的iPhone(使用法语和法语区域设置配置)上,我希望使用其他格式(例如:1 234,56€)。但这是行不通的,并且似乎使用了英语格式样式(例如:€1 234,56)。
实际上,如果我从设备上的应用程序中打印当前的语言环境,它不会fr_FR像我期望的那样返回:
NSLog(Locale.current.identifier)
>>> en_FR
Run Code Online (Sandbox Code Playgroud)
该地区不错,但语言却不好,尽管该设备上的iOS显然是法语。
有没有人对此有想法?
谢谢!
ios ×5
objective-c ×4
swift ×3
cocoa-touch ×2
locale ×2
currency ×1
formatting ×1
ios-charts ×1
ios10 ×1
iphone ×1
localization ×1
nslocale ×1
nsnumber ×1
null ×1
optional ×1
swift3 ×1