schwarzの雑記 このページをアンテナに追加 RSSフィード

06/02/23 (Thu)2月23日の雑記

[] 21:06 2月23日の雑記 - schwarzの雑記 を含むブックマーク

「数字に対応するドイツ語のつづりを返すプログラム」を必死に組んでました。やっとこできました。予想とは裏腹に猛烈な苦労を強いられました。英語感覚で挑むと痛い目にあいます。


具体的には、たとえば

p 1.de

とすると、

"eins"

が返されるというものです。


#==========================================================
# ■ Integer
#----------------------------------------------------------
#  整数クラス
#==========================================================
class Integer

  #--------------------------------------------------------
  # ● 数字nのドイツ語のつづりを返す
  #---------------------------------------------------------
  def de(n = self)
    
    # 範囲外
    if n < 0 || n > 1000000000000000
      return "unbestimmt"
    end
    
    case n
    when 0
      return "null"
    when 1
      return "eins"
    when 2
      return "zwei"
    when 3
      return "drei"
    when 4
      return "vier"
    when 5
      return "fünf"
    when 6
      return "sechs"
    when 7
      return "sieben"
    when 8
      return "acht"
    when 9
      return "neun"
    when 10
      return "zehn"
    when 11
      return "elf"
    when 12
      return "zwölf"
    when 13
      return "dreizehn"
    when 14
      return "vierzehn"
    when 15
      return "fünfzehn"
    when 16
      return "sechzehn"
    when 17
      return "siebzehn"
    when 18
      return "achtzehn"
    when 19
      return "neunzehn"
    when 20
      return "zwanzig"
    when 30
      return "dreißig"
    when 40
      return "vierzig"
    when 50
      return "fünfzig"
    when 60
      return "sechzig"
    when 70
      return "siebzig"
    when 80
      return "achtzig"
    when 90
      return "neunzig"
      
    # 2桁の場合
    when 21..99
      # 1の位と10の位に分解し再帰
      n1  = n % 10
      n10 = n - n1      
      if n1 == 1
        n1str = "ein"
      else
        n1str = de(n1)
      end
      n10str = de(n10)
      return sprintf("%sund%s", n1str, n10str)
  
    # 3桁の場合
    when 100...999
      # 100の位と100未満に分けて再帰
      n100 = n / 100
      n10 = n - n100*100
      if n100 == 1
        n100str = "hundert"
      else
        n100str = de(n100) + "hundert"
      end
      n10str = de(n10)
      n10str = ""  if n10str == "null"
      return sprintf("%s%s", n100str, n10str)
  
    # 4桁以上の場合
    else
        
      # 一時的に文字列化
      nstr = n.to_s
      narray = [""]
        
      # 3桁ずつに区切る
      nstr.reverse.each_byte{ |c|
        if narray[0].size == 3
          narray.unshift("")
        end
        narray[0].insert(0, c.chr)
      }
        
      # 整数に戻す
      narray.collect!{ |s| s.to_i }
        
      # 3桁ずつ再起呼び出し
      str = ""
      narray.reverse.each_with_index{ |n, i|
        case n
        when 0
          s = ""
        when 1
          if i == 1
            s = "ein"
          else
            s = "eine"
          end
        else
          s = de(n)
        end
        # tausend,Millionなどをつける
        case i
        when 1
          s << "tausend"
        when 2
          if n == 1
            s << " Million "
          else
            s << " Millionen "
          end
        when 3
          if n == 1
            s << " Milliarde "
          else
            s << " Milliarden "
          end
        when 4
          if n == 1
            s << " Billion "
          else
            s << " Billionen "
          end
        end
        str.insert(0, s)
      }
      
      return str
        
    end
    
  end
  
end

ここで、

print 7008009001234.de

を実行すると結果はこうなります。

sieben Billionen acht Milliarden neun Millionen 
eintausendzweihundertvierunddreißig