2017-02-20 14 views
-3

私は現在の時間を得ることができます。今度はそれを言葉で出力したいと思います。現在の時刻を言葉で表現する方法

let date = Date() 
let calendar = Calendar.current 
let hour = calendar.component(.hour, from: date) 
let minutes = calendar.component(.minute, from: date) 
let seconds = calendar.component(.second, from: date) 
print("hours = \(hour):\(minutes):\(seconds)") 

出力

10:30

取得する方法このような -

それは10

+2

はフランスのシステム上で何が起こるのでしょうか?アラビア語のシステムでは? – matt

+0

@matt –

+0

どこにいらっしゃいましたか? ** [何を試しましたか?](http://whathaveyoutried.com/)** – holex

答えて

4

@MwcsMacが彼の答えで指摘するように、これを解決する鍵はFormatterです(一度NSFormatterとして知られている)、特に.spellOut.numberStyleを設定することもできます。

これは現在のロケール(したがって言語)を選択しますが、英語よりも多くの言語で同じ「半分」「四半期」という用語を使用しないことが問題です。たとえば、ドイツ語10:30は "ハーフエルフ"、文字通り "半分(11)"です。 は、ロケールが英語/アメリカンであることを前提としていること

コードの記述は本当に悪い習慣あり、それはそれらの領域外で提供されている場合は、おそらくアプリが拒否されますので、実際に何ができる最良のものは、形式「10: 30 "を" ten thirty "、" zehndreißig "とする。 @MwcsMacへの謝罪と

コード:

import Foundation 

let date = Date() 
let calendar = Calendar.current 
let hour = calendar.component(.hour, from: date) 
let minute = calendar.component(.minute, from: date) 

func spell(_ number: Int, _ localeID: String) -> String { 
    let formatter = NumberFormatter() 
    formatter.numberStyle = .spellOut 
    // Specify the locale or you will inherit the current default locale 
    formatter.locale = Locale(identifier: localeID) 
    if let s = formatter.string(from: NSNumber(value: number)) { 
     // AVOID forced unwrapping at all times! 
     return s 
    } else { 
     return "<Invalid>" // or make return optional and return `nil` 
    } 
} 
spell(hour, "EN") + " " + spell(minute, "EN") // "nineteen thirty-three" 
spell(hour, "FR") + " " + spell(minute, "FR") // ""dix-neuf trente-trois" 
spell(hour, "AR") + " " + spell(minute, "AR") // "تسعة عشر ثلاثة و ثلاثون" 
+0

このコードの上にビルドします。 'let langStr = Locale.current.languageCode'を追加して、'スペル(時、langStr!)+ "" +スペル(分、langStr!どの言語コードを渡すのを処理しますか。 – MwcsMac

+0

確かに - (あなたのコードがそうするように)あなたはロケールを無視することができ、デフォルトでは 'Locale.current'になります!私はちょうどロケールが重要であることを明確にするためにそれを追加しました。 – Grimxn

3

は、このコードは、それが可能であることを示します時半です最終目標を達成する。上記のように、達成したい組み合わせのロジックを作成する必要があります。

スウィフト3

let date = Date() 
let calendar = Calendar.current 
let hour = calendar.component(.hour, from: date) 
let minutes = calendar.component(.minute, from: date) 
let seconds = calendar.component(.second, from: date) 

func spell(_ number: Int) -> String { 
    let formatter = NumberFormatter() 
    formatter.numberStyle = .spellOut // This will convert the number to words. 
    return formatter.string(from: NSNumber(value: number))! 
} 

if minutes == 30 { 
    let hourString = spell(hour) 
    print("It's half past \(hourString)") 
} 

これは時間枠の範囲を使用する方法であるかもしれません。

if case 1 ... 14 = minutes { 
    let hourString = spell(hour) // This will give your hour in word form 
    let minString = spell(minutes) // This will give your minutes in word form 
    print("It's \(minString) past \(hourString)") 
} 
+0

これは便利な回答ですが、実際にはそれを整理する必要があります。 'number'が既に' Int'であるとき 'let numberAsNumber = Int(number)'は何をしますか?なぜ 'if'節に' 'formatter ='を入れてしまうのですか? 'minutes <= 30'の場合はどうなりますか?あなたのやっていることをコメントしてください! – Grimxn

+0

1時間15分から29分のすべてを「過去1/4」とみなす人はわかりません。 – rmaddy

+0

ありがとう@ MwcsMac –

関連する問題