如何在Objective-C中将整数转换为相应的单词?

36

在Objective-C和iOS上有没有一种方法将整数数字拼写成文本?

例如,如果我有一个整数数字:

NSInteger someNumber = 11242043;

我想知道是否有函数能返回一个类似于“一千二百三十四万五千六百七十八”的字符串。

7个回答

63

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


谢谢!运行得非常好! - cabgef
@(anInt) 可以稍微更加简洁地书写;根据快速测试,NSNumberFormatter 在本地化方面也不是完美的(尽管使用英式英语,我得到了连字符版本的 forty 和没有 'and'),但它可能仍然比构建自己的方法好上百万倍。 - Tommy

37

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


这对于大量数据不起作用(即如果是1,00,000,则返回“一十万”) - Saifan Nadaf

10

来自文档:

NSNumberFormatterSpellOutStyle

指定拼写格式;例如,“23”变成“twenty-three”。

在iOS 2.0及更高版本中可用。

声明于NSNumberFormatter.h中。

由于您的问题不是非常具体,因此我也不会发布完整的代码来源。


如果我需要将23拼写为“twenty third”,该怎么办? - abhimuralidharan

8

在 Swift 5 / iOS 12.2 中,NumberFormatter 增加了一个 numberStyle 属性,可以设置为 NumberFormatter.Style.spellOutspellOut 具有以下声明:

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

这对于大量数据不起作用(即如果是1,00,000,则返回“一十万”) - Saifan Nadaf

6
我们可以像这样用Swift来实现。
   let formatter = NSNumberFormatter()
   formatter.numberStyle = NSNumberFormatterStyle. SpellOutStyle
   println("\(identifier) \(formatter.stringFromNumber(1234.5678))")

5
您可以使用以下函数将整数转换为文字,并使用Swift本机数字样式。
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"))

1

为了自己的参考,这是@moca的答案,已经准备好使用:

- (NSString *) spellInt:(int)number {
    NSNumber *numberAsNumber = [NSNumber numberWithInt:number];
    NSNumberFormatter *formatter = [NSNumberFormatter new];
    [formatter setNumberStyle:NSNumberFormatterSpellOutStyle];
    return [formatter stringFromNumber:numberAsNumber];
}

注意:这是使用 ARC。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接