Как преобразовать целое число в соответствующие слова в objective-c?
Есть ли способ в Objective-C на iOS, чтобы указать целое число в виде текста?
Например, если у меня есть
NSInteger someNumber = 11242043;
Я хотел бы знать некоторую функцию, чтобы вернуть строку, похожую на "одиннадцать миллионов двести сорок две тысячи сорок три".
Ответы
Ответ 1
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
Ответ 2
Мощность расширения для Swift 3/4
import Foundation
public extension Int {
public var asWord: String {
let numberValue = NSNumber(value: self)
var formatter = NumberFormatter()
formatter.numberStyle = .spellOut
return formatter.string(from: numberValue)!
}
}
var value = 2
println("\(value.asWord)")
Вывод:
два
Ответ 3
Из документов:
NSNumberFormatterSpellOutStyle
Определяет формат заклинания; например, "23" становится "двадцать три".
Доступен в iOS 2.0 и более поздних версиях.
Объявлено в NSNumberFormatter.h.
Поскольку ваш вопрос не очень конкретный, я не буду публиковать полноценный источник кода.
Ответ 4
Мы можем сделать это быстро, как это.
let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle. SpellOutStyle
println("\(identifier) \(formatter.stringFromNumber(1234.5678))")
Ответ 5
Вы можете использовать приведенную ниже функцию, чтобы преобразовать целое число в слова, используя стиль swift native number.
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"))
Ответ 6
В Swift 5/iOS 12.2 NumberFormatter
имеет свойство numberStyle
которое можно установить со значением NumberFormatter.Style.spellOut
. spellOut
имеет следующую декларацию:
case spellOut = 5
Формат стиля, в котором числа прописаны на языке, определенном языковым стандартом форматера чисел.
Например, в локали en_US число 1234.5678 представлено как одна тысяча двести тридцать четыре целых пять шесть семь восемь; в локали fr_FR число 1234.5678 представлено как mille deuxcent trente-quatre virgule cinq шесть сентября.
Этот стиль поддерживается для большинства пользовательских локалей. Если этот стиль не поддерживает локаль средства форматирования чисел, локаль en_US используется как запасной вариант.
Приведенный ниже код игровой площадки показывает, как преобразовать целое число в текст с NumberFormatter
spellOut
стиля 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
Ответ 7
Для моей справки это ответ @moca, но готов к использованию:
- (NSString *) spellInt:(int)number {
NSNumber *numberAsNumber = [NSNumber numberWithInt:number];
NSNumberFormatter *formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterSpellOutStyle];
return [formatter stringFromNumber:numberAsNumber];
}
Примечание: используется ARC.