FrontPage  Index  Search  Changes  RSS  wikifarm  Login

StringZen.rb

概要

全角⇔半角変換です。


依存性

  1. windows専用です。(Linux でも SJIS で良ければ使えます。EUCに変換して半角カナを取り去れば、EUCでも使えるかな??)

利用者


実行見本:


コメントがありましたらどうぞ

  • 2008-03-27 (Don) 05:46:39 Anonymous : hasan
(comment plugin is disabled).

説明


ソース:(web上の表示では半角が全角で表示されてしまうようです。ソースをダウンロードしてお使いください)

StringZen.rb

#!ruby -Ks
#-- StringZen.rb
#-- StringZen.pi

# 注意:このライブラリを(間接的にでも)require するプログラムの先頭に #! ruby -Ks が入っていないとエラーになる。
#       漢字コードがsjisであり kcode=none でxxすると何らかの文字が「"」とか「'」などにマッチしてしまう模様。

require 'jcode'

    #
    #
    #  必ずしも1対1で対応していないのが問題。
    #  算用数字と漢数字、ひらがなとカタカナ。
    #  「、」←→「,」「、」、「ー」「−」←→「ー」「-」など。
    #
    #  変換したくない部分もあるだろう。記号は変換しない、とか・・。
    #
    #  'ア' → 'あ' 、 '9' → '九' をしたいとか・・。
    #
    #  '9' '9' → '九' をしたいなら tr( SUU+SAN , KAN ) でOK。
    #
    #  KAN などを定数として用意しておくとなにかと便利に使えるだろう。
    #

module StringZen

EXP_HANKAKU = /[。-゜]+/ # 『。 「 」 、 ・ ヲ ァ ィ ゥ ェ・・ ラ リ ル レ ロ ワン ゛ ゜』

SUU  = '0123456789'           # 半角数字
SAN  = '0123456789' # 算用数字
KAN  = '〇一二三四五六七八九' # 漢数字
TAK3 = '〇壱弐参四五六七八九' # 123
TAK5 = '〇壱弐参四伍六七八九' # 123 5
TAK  = '零壱弐参肆伍陸漆捌玖' # 多角数字

    #
    #  '-' は最初にないと tr(HAN_KIGO,ZEN_KIGO) で誤動作する。
    #  '\' は最後にないと tr(ZEN_KIGO,HAN_KIGO) で誤動作する。
    #  han_to_zen では tr(Regexp::quote(HAN_KIGO),ZEN_KIGO) が必要。
    #
HAN_KIGO  = '-,.!"#$%&\'()=~|^@[`{;:]+*}/<>?_\\'
ZEN_KIGO  = '−,.!”#$%&’()=〜|^@[`{;:]+*}/<>?_¥'

HAN_KANA_KIGO = 'ー、。「」・'
ZEN_KANA_KIGO = 'ー、。「」・'

    #
    #  文章中で、発音の要素として使われるもの。長音記号「ー」も要素とする。
    #  ヱゑ、は半角がないので対象外。
    #
KANA1  = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンャュョァィゥェォッ゛゜ー'
KATA1 = 'アイウエオカキクケコサシスセソタチツテトナニヌネノ'+
             'ハヒフヘホマミムメモヤユヨラリルレロワヲンャュョァィゥェォッ゛゜ー'
HIRA1 = 'あいうえおかきくけこさしすせそたちつてとなにぬねの'+
             'はひふへほまみむめもやゆよらりるれろわをんゃゅょぁぃぅぇぉっ゛゜ー'

    #
    #	tr22 で変換するタイプ
    #
KANA2  = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ'
KATA2 = 'ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヴ'
HIRA2 = 'がぎぐげこざじずぜぞだぢづでどばびぶべぼぱぴぷぺぽヴ'

end # module

module StringZen

  def tr22!( from, to ) # 2 bytes to 2 bytes
    n = 0
    while n < from.size
      f = from[n,2]
      t = to[n,2]
      gsub!(f,t)
      n += 2
    end
    return self
  end

  def tr22( from, to ) # 2 bytes to 2 bytes
    dup.tr22!(from,to)
  end

    #
    #  has_zen?    全角を含むかどうかを返す。
    #
    #  含まない場合には nil、含む場合にはそのバイト位置を返す。
    #
  def has_zen?
    mbchar?
  end

    #
    #  半角 ⇔ 全角
    #

    #
    #  Ascii記号
    #
    #  * カナ記号(「、」「。」など)は含まない。
    #
  def kigo_to_zen
    tr( Regexp::quote(HAN_KIGO) , ZEN_KIGO )
  end

  def kigo_to_han
    tr( ZEN_KIGO , HAN_KIGO )
  end

    #
    #  アルファベット
    #
  def alpha_to_zen
    tr( 'A-Za-z' , 'A-Za-z' )
  end

  def alpha_to_han
    tr( 'A-Za-z' , 'A-Za-z'  )
  end

    #
    #  半角数字 → 全角算用数字
    #  半角数字 → 全角漢数字
    #
    #  suu:半角数字
    #  san:全角算用数字
    #  kan:全角漢数字
    #
  def san_to_suu
    tr( '0-9', '0-9' )
  end
  alias san_to_han san_to_suu

  def kan_to_suu
    tr( KAN , '0-9' )
  end
  alias kan_to_han kan_to_suu

  def to_suu
    tr( '0-9'+KAN , '0-90-9' )
  end
  alias suu_to_han to_suu # suu_ は san+kan の意味.名前に疑問

  def suu_to_san
    tr( '0-9' , '0-9' )
  end
  alias suu_to_zen suu_to_san

  def kan_to_san
    tr( KAN , '0-9' )
  end

  def to_san
    tr( '0-9'+KAN , '0-90-9' )
  end

  def suu_to_kan # '〇一二三四五六七八九'
    tr( '0-9' , KAN )
  end

  def san_to_kan
    tr( '0-9', KAN )
  end

  def to_kan
    tr( '0-90-9' , KAN+KAN )
  end

    #
    #  半角かな+半角カナ記号 → 全角カタカナ、全角ひらがな+全角カナ記号
    #
    #  kana: 半角カタカナ
    #  kata: 全角カタカナ
    #  hira: 全角ひらがな
    #
    #  [ruby-list:31256] Re: 半角から全角へ変換
    #	def kana_to_kata
    #	  require 'nkf'
    #	  NKF.nkf('-XSs', self )
    #	end
    #
  def kana_to_kata
    tr22( KANA2 , KATA2 ).
    tr( KANA1+HAN_KANA_KIGO , KATA1+ZEN_KANA_KIGO )
  end
  alias kana_to_zen  kana_to_kata

  def hira_to_kata
    tr( HIRA1+HIRA2 , KATA1+KATA2 )
  end

  def to_kata
    kana_to_kata.
    hira_to_kata
  end

  def kana_to_hira
    tr22( KANA2 , HIRA2 ).
    tr( KANA1+HAN_KANA_KIGO , HIRA1+ZEN_KANA_KIGO )
  end

  def kata_to_hira
    tr( KATA1+KATA2 , HIRA1+HIRA2 )
  end

  def to_hira
    kana_to_hira.
    kata_to_hira
  end

  def kata_to_kana
    tr22( KATA2 , KANA2 ).
    tr( KATA1+ZEN_KANA_KIGO , KANA1+HAN_KANA_KIGO )
  end
  alias kata_to_han kata_to_kana

  def hira_to_kana
    tr22( HIRA2 , KANA2 ).
    tr( HIRA1+ZEN_KANA_KIGO , KANA1+HAN_KANA_KIGO )
  end
  alias hira_to_han hira_to_kana

  def to_kana
    tr22( KATA2+HIRA2 , KANA2+KANA2 ).
    tr( KATA1+HIRA1+ZEN_KANA_KIGO , KANA1+KANA1+HAN_KANA_KIGO )
  end
  alias kana_to_han to_kana  #  名前に疑問あり

  def space_to_zen # 2002-11-19(火)
    tr(' ',' ')
  end

  def space_to_han # 2002-11-19(火)
    tr(' ',' ')
  end

    #
    #  逆変換可能な範囲で変換する。
    #
    #
  def han_to_zen
    kana_to_kata.
    suu_to_san.
    alpha_to_zen.
    kigo_to_zen.
    space_to_zen
  end
  alias to_zen han_to_zen

  def zen_to_han
    kata_to_kana.
    san_to_suu.
    alpha_to_han.
    kigo_to_han.
    space_to_han
  end
  alias to_han zen_to_han

  def has_han?
    /[#{HAN_KANA_KIGO+KANA1}]/ =~ self
  end

  def to_tak3
    tr( '0-90-9'+KAN,TAK3*3 )
  end

    #
    #  cf. [ruby-list:34080] by 浦 岳史 (うら たけふみ)
    #
  def to_man
    tanis = ['垓','京','兆','億','万','']
    reverse.scan(/.{1,4}/).collect{|s|
      tani = tanis.pop.to_s
      suu = s.reverse.sub(/^0*/,'')
      suu+tani unless suu.empty?
    }.reverse.to_s
  end

  def juu4
    tanis = ['千','百','十',''] # 仟 拾
    reverse.scan(/./).collect{|s|
      tani = tanis.pop.to_s
      case s
      when '0','' ; ''
      when '1'    ; ['百','十'].include?(tani) ? tani : s+tani
      else        ; s+tani
      end
    }.reverse.to_s
  end

  def to_juu
    tanis = ['垓','京','兆','億','万',''] # 萬
    reverse.scan(/.{1,4}/).collect{|s|
      tani = tanis.pop.to_s
      suu = s.reverse.sub(/^0*/,'').juu4
      suu+tani unless suu.empty?
    }.reverse.to_s
  end

end

class String
  include StringZen
end

class Integer
  def to_man
    to_s.to_man
  end
  def to_kan
    to_s.to_man.to_kan
  end
  def to_san
    to_s.to_man.to_san
  end
  def to_juu
    to_s.to_juu
  end
  def to_tak3
    to_s.to_juu.to_tak3
  end
  def to_tak5
    to_s.to_juu.to_tak5
  end
  def to_tak
    to_s.to_juu.to_tak
  end
end

if __FILE__ == $0

  p 123450678901.to_man        #=> "1234億5067万8901"
  p 123450678901.to_kan        #=> "一二三四億五〇六七万八九〇一"
  p 123450678901.to_san        #=> "1234億5067万8901"

  p 123450678901.to_juu        #=> "1千2百3十4億5千6十7万8千9百1"
  p 123450678901.to_tak3       #=> "壱千弐百参十四億五千六十七万八千九百壱"
  p 123450678901.to_juu.to_kan #=> "一千二百三十四億五千六十七万八千九百一"

##raise

  p 123456789.to_man.to_san             #=> 1億2345万6789
  p 123456789.to_man.to_kan             #=> 一億二三四五万六七八九
  p 123456789.to_juu.tr("0-9",String::TAK5)            #=> 壱億弐参四伍万六七八九
#raise
  p 1234567890123456789012345.to_man	#=> 123456789京0123兆4567億8901万2345
  p 100000000.to_man                    #=> 1億
  p 1002003000000.to_man                #=> 1兆20億300万
  p 1002003000000.to_man.to_kan         #=>  一兆二〇億三〇〇万
  p 100200300000.to_man                 #=> 1002億30万
  p 10020030000.to_man                  #=> 100億2003万

raise

raise

require "LetterFormat"  #  ../../tkUtils/LetterFormat
require "DateTime_format_ex"   #  ../../tkUtils/DateTime_ex"

hash = {}
  today   = hash.delete(:today)   || Phi::DateTime.today
  today_J = hash.delete(:today_J) || today.to_G.to_san
  sengetu = today.inc_month(-1)
p sengetu_J = sengetu.to_G.to_san #.split("月")[0]+"月"
p "平成15年6月1日".to_san
##raise

  puts "        ハンカクカナ".inspect
raise

##  p String::KAN
##
  s = "「123,abc,XYZ.	エ゛ッ。チャーントヘンカンデキッカナァ?」"
##  p "s",s
##  p "s.kana_to_kata" , s.kana_to_kata, s.kana_to_kata.kata_to_kana
##  p "s.kana_to_hira" , s.kana_to_hira, s.kana_to_hira.hira_to_kana
##  p "s.to_zen" , s.to_zen, s.to_zen.to_han
##  p "s.to_kan" , s.to_kan.to_hira.to_zen, s.to_kan.to_hira.to_zen.to_han
##
##  p "「123,abc,XYZ.エ゛ッ。チャーントへんかんデキッカナァ?」".has_zen?
##  p "「123,abc,XYZ.エ゛ッ。チャーントヘンカンデキッカナァ?」".has_zen?
##  p "「123,abc,XYZ.エ゛ッ。チャーントヘンカンデキッカナァ?」".has_han?
##  p "123,abc,XYZ.エ゛ッ。チャーントヘンカンデキッカナァ?".has_han?
##

  p s

  raise
end

Last modified:2008/03/27 05:46:39
Keyword(s):
References:[String_inspect.rb]