在Objective-C和iOS上有没有一种方法将整数数字拼写成文本?
例如,如果我有一个整数数字:
NSInteger someNumber = 11242043;
我想知道是否有函数能返回一个类似于“一千二百三十四万五千六百七十八”的字符串。
在Objective-C和iOS上有没有一种方法将整数数字拼写成文本?
例如,如果我有一个整数数字:
NSInteger someNumber = 11242043;
我想知道是否有函数能返回一个类似于“一千二百三十四万五千六百七十八”的字符串。
Apple内置了许多方便的格式化功能,适用于许多数据类型。称为“格式化器”,它们可以将对象转换为/从字符串表示形式。
对于您的情况,您将使用NSNumberFormatter,但如果您有一个整数需要转换为NSNumber,请先参考下面的示例。
NSInteger anInt = 11242043;
NSString *wordNumber;
//convert to words
NSNumber *numberValue = [NSNumber numberWithInt:anInt]; //needs to be NSNumber!
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterSpellOutStyle];
wordNumber = [numberFormatter stringFromNumber:numberValue];
NSLog(@"Answer: %@", wordNumber);
// Answer: eleven million two hundred forty-two thousand forty-three
如果你想了解更多关于格式化程序的内容: https://developer.apple.com/library/content/documentation/General/Conceptual/Devpedia-CocoaApp/Formatter.html
Swift 5的扩展功能
import Foundation
public extension Int {
var asWord: String? {
let numberValue = NSNumber(value: self)
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
return formatter.string(from: numberValue)
}
}
var value = 2
if let valueAsWord = value.asWord {
//do something with your worded number here
print("value worded = \(valueAsWord)")
} else {
print("could not word value :(")
}
注意:编辑以防止formatter.string(from:
返回nil,这是高度不太可能的,但仍然有可能。
输出: value worded = two
来自文档:
NSNumberFormatterSpellOutStyle
指定拼写格式;例如,“23”变成“twenty-three”。
在iOS 2.0及更高版本中可用。
声明于NSNumberFormatter.h中。
由于您的问题不是非常具体,因此我也不会发布完整的代码来源。
在 Swift 5 / iOS 12.2 中,NumberFormatter
增加了一个 numberStyle
属性,可以设置为 NumberFormatter.Style.spellOut
。 spellOut
具有以下声明:
case spellOut = 5
一种样式格式,其中数字是按照数字格式化地区定义的语言拼写出来的。
例如,在en_US地区,数字1234.5678表示为one thousand two hundred thirty-four point five six seven eight; 在fr_FR地区,数字1234.5678表示为mille deux cent trente-quatre virgule cinq six sept huit。
大多数用户地区都支持这种样式。如果此样式不支持数字格式化程序语言环境,则使用en_US语言环境作为备选。
以下游乐场代码展示了如何使用NumberFormatter
spellOut
样式将整数转换为拼写文本:
import Foundation
let integer = 2018
let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.spellOut
let spellOutText = formatter.string(for: integer)!
print(spellOutText) // prints: two thousand eighteen
let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle. SpellOutStyle
println("\(identifier) \(formatter.stringFromNumber(1234.5678))")
func toWords<N>(number: N) -> String? {
let formatter = NumberFormatter()
formatter.numberStyle = .spellOut
switch number {
case is Int, is UInt, is Float, is Double:
return formatter.string(from: number as! NSNumber)
case is String:
if let number = Double(number as! String) {
return formatter.string(from: NSNumber(floatLiteral: number))
}
default:
break
}
return nil
}
print(toWords(number: 12312))
print(toWords(number: "12312"))
为了自己的参考,这是@moca的答案,已经准备好使用:
- (NSString *) spellInt:(int)number {
NSNumber *numberAsNumber = [NSNumber numberWithInt:number];
NSNumberFormatter *formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterSpellOutStyle];
return [formatter stringFromNumber:numberAsNumber];
}
@(anInt)
可以稍微更加简洁地书写;根据快速测试,NSNumberFormatter 在本地化方面也不是完美的(尽管使用英式英语,我得到了连字符版本的 forty 和没有 'and'),但它可能仍然比构建自己的方法好上百万倍。 - Tommy