- ベストアンサー
漢数字の変換
法律条文の中にある漢数字、十二、八十、百二十五、千二十五といったものを、変換して、12、80、125というようにアラビア数字に変換したいのです。例えば、125が一二五というように記載されていたら簡単だったのですが、上記のような記載形式のため、困ってます。いい方法はないものでしょうか?もしくは、そんなソフトはどこかで、無料で配布してませんか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
「漢数字 アラビア数字 変換」で検索したら引っ掛かりました。 漢数字→数字変換プロセッサ『なんば君』 http://www.vector.co.jp/soft/winnt/util/se338739.html ※デフォルトでは、漢数字が一桁の場合(第一章、第二条など)置換対象からはじく仕様のようです。 設定>変換する単位文字を追加 で「編章節款目」などと単位を指定すると正常に動作します。 民法を対象に動作確認しましたが、 挙動をざっと見ただけで逐一チェックはしてません、悪しからず。
その他の回答 (8)
- SortaNerd
- ベストアンサー率43% (1185/2748)
No8です。先ほどのものだと1文字空けて二つ数字が続いた場合(例:「百、十」)に不具合がありますので手順3を以下のように訂正します。 3. 千([一二三四五六七八九十百][^百]) → 千0百\1 百([一二三四五六七八九十][^十]) → 百0十\1 また、1で指定する文字は文中に存在する文字でも問題ありませんでした。ただしその場合6を 〓〓$ → (何もなし) とする必要があります。
- SortaNerd
- ベストアンサー率43% (1185/2748)
正規表現の使えるテキストエディタで以下を順に置換してください。 なお自分はEmEditorで実験しました。 1. $ → 〓〓 …(行末にダミー追加。後述) 2. ([^二三四五六七八九])十 → \1一十 ([^二三四五六七八九])百 → \1一百 ([^二三四五六七八九])千 → \1一千 …(単独の十・百・千を一十・一百・一千に) 3. 千(.[^百]) → 千0百\1 百(.[^十]) → 百0十\1 十([^一二三四五六七八九]) → 十0\1 …(空いた桁に0を入れる) 4. 千 → (何もなし) 百 → (何もなし) 十 → (何もなし) …(不要になった十・百・千を消去) 5. 一 → 1 : : 九 → 9 …(漢数字を算用数字に変換) 6. 〓〓 → (何もなし) なお最初の「$ → 〓〓」の理由ですが、 手順3で求める数字の2文字先を見て判断しているので、行末に数字があると正しく判断されません。これを防ぐために行末にダミーを追加しています。 これはどんな文字列でもかまいませんが、後で消すことになるので文章中に現れない文字列にしてください。
お礼
どうもありがとうございます。 なかなか使えるソフトを見つけていただけました。
- U-Seven
- ベストアンサー率56% (557/986)
どのアプリケーションを使われているか記載がないですが。 ワードや一太郎で何回か文字の置き換えをすれば出来るはずですよ。 1回目:千百十 → 111、に置き換え 2回目:千百 → 11、 3回目:千 → 1、 4回目:百十→ 11、 5回目:第百 → 第1、 6回目:百を削除、(二百~九百が二~九になる) 7回目:第十 → 第1、 8回目:十条 → 0条、(末尾20~90番のキリ番処置) 9回目:十を削除、(二十~九十が二~九になる) 最終回:残っている漢数字をアラビア数字に変換すればOK。 順番を間違わないで下さい。 ただし第百条・第千条のようにキリ番の場合は、第1条になってしまうので変換後の確認で修正して下さい。 回数が多いようですが、先頭文字が百や十の場合の対策なので仕方ない、それでも置き換えダイアログに入力するだけです。 今ある機能で工夫してはどうでしょう。 一見手間ですが、マクロとか関数を勉強してる間に終わっちゃいます。^^
補足
どうもありがとうございます。 第百一条、第百十条が11条などなど、結構、修正が多そうです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは #1です。 >この関数式をどう生かせば、エクセルもしくは、ワードの中の漢数字を変換できるのでしょう? 本来は、ユーザー定義関数にして、それをサブルーチン関数にし、Wordの文章の中で、その文字を探して、変換するようにするか、元のソースの形態が分かりませんが、WordのDocument のText プロパティの中で、正規表現で探して、処理するのが良いのではないかと考えています。 このユーザー定義関数の最終的な目標は、IMEの再変換のようになればよいわけです。 ユーザー側は、組み込み自体は、コードを貼り付けて実行するだけの話ですが。 インターネット検索すれば、出てくるようですが、私の場合は、新たな開発には相応に時間もかかるし、どうもメジャーな話のようなので、このまま様子を見させていただくことにします。
訂正: ? CLong_KAN("二百") 200 が、正しい変換結果です。 ? CLong_KAN("二百") 300 は、二重加算を確認した際の名残りでした。
- enunokokoro
- ベストアンサー率74% (3543/4732)
以前、似たような質問があったときに興味があり、テキストとして保存 してあるWord用のマクロがあります。回答者が誰だか忘れてたことと、 質問ナンバーを控えていなかったので、過去ログで検索しても探すこと が出来ませんでした(たぶんどこかにあるはず)。 以下のマクロは、その当時掲載されたままのものですので質問内容とは 少し違うものかもしれませんが参考になると思います。 '*************************ここから*************************** Sub ChgToArabic() Dim i, LNGT, Kanji, N, LL, L, K, SARABIC Const Kansuu = "一二三四五六七八九〇" Const Suuji = "1234567890" Selection.HomeKey Unit:=wdStory Perform: Selection.Find.ClearFormatting With Selection.Find .Text = "第*条" .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With If Selection.Find.Execute = False Then Exit Sub LNGT = Selection.Characters.Count Selection.Characters.Last.Select Selection.MoveLeft Unit:=wdCharacter, Count:=LNGT - 1 Selection.MoveRight Unit:=wdCharacter, Count:=LNGT - 2, Extend:=wdExtend Kanji = Selection.Characters.Parent LL = Len(Kanji) SARABIC = "" L = 0 CHG: L = L + 1 N = Mid(Kanji, L, 1) Select Case N Case Is = "一", "二", "三", "四", "五", "六", "七", "八", "九", "〇" K = Mid(Suuji, InStr(Kansuu, N), 1) Case Is = "十", "百" If L = 1 Then K = "1" SARABIC = SARABIC & K GoTo EXT End If Select Case Mid(Kanji, L - 1, 1) Case Is = "一", "二", "三", "四", "五", "六", "七", "八", "九" GoTo EXT Case Else Select Case Mid(Kanji, L + 1, 1) Case Is = "十", "百" If N = "十" Then K = "1" If N = "百" Then K = "1" Case Is = "一", "二", "三", "四", "五", "六", "七", "八", "九" If N = "十" Then K = "1" If N = "百" Then K = "10" Case Else If N = "十" Then K = "10" If N = "百" Then K = "100" End Select SARABIC = SARABIC & K GoTo CHG End Select Case Else K = N End Select SARABIC = SARABIC & K If L < LL Then GoTo CHG Selection = SARABIC Selection.MoveRight Unit:=wdCharacter, Count:=1 GoTo Perform Exit Sub EXT: Select Case N Case Is = "十" Select Case Mid(Kanji, L + 1, 1) Case Is = "一", "二", "三", "四", "五", "六", "七", "八", "九" K = "" Case Else K = "0" End Select Case Is = "百" Select Case Mid(Kanji, L + 1, 1) Case Is = "十" K = "" Case Is = "一", "二", "三", "四", "五", "六", "七", "八", "九" Select Case Mid(Kanji, L + 2, 1) Case Is = "十" K = "" Case Else K = "0" End Select Case Else K = "00" End Select End Select SARABIC = SARABIC & K If L < LL Then GoTo CHG Selection = SARABIC End Sub '*************************ここまで*************************** これは「第一条」などの条文の箇条部分を変換するものですので、質問 の内容からは少し違うものかもしれませし、「百九十九条」までを対象に しているものなので少し手直しが必要でしょうが、参考になるのでは。
お礼
どうもありがとうございます。 簡単にはいかないようですね。
一介のデザイナでプログラマではありません。 が、以下のような関数を使って変換することが考えられます。 Public Function CLong_KAN(ByVal KanSuji As String) As Long Dim I As Integer Dim L As Integer Dim C As String Dim N As Integer Dim M As Integer Dim T As Integer Dim V As Long T = 1 L = Len(KanSuji) For I = L To 1 Step -1 C = Mid$(KanSuji, I, 1) N = InStr(1, "一二三四五六七八九", C, vbTextCompare) M = InStr(1, "十百千", C, vbTextCompare) V = V + T * N + IIf(M > 0, 10 ^ M, 0) - IIf(N > 0 And T > 1, T, 0) T = 10 ^ M Next I CLong_KAN = V End Function 下桁から順次に変換します。 一二三四五六七八九は、その位に応じて加算するために T*N を加算します。 十百千は、10^M で一旦加算しることにします。 ただ、これだけですと、二百は 100+200=300 と二重加算されます。 ですから、N>0 の場合は、一旦加算した 10^M(=T) を減算して調節します。 しかし、このアルゴリズムらしきものが正しいかどうかは、非常に怪しい。 なお、一応、15個の漢数字については正常に変換しているようです。 [イミディエイト] ? CLong_KAN("一") 1 ? CLong_KAN("十") 10 ? CLong_KAN("十一") 11 ? CLong_KAN("百") 100 ? CLong_KAN("百一") 101 ? CLong_KAN("百十一") 111 ? CLong_KAN("二百") 300 ? CLong_KAN("二百十三") 213 ? CLong_KAN("千") 1000 ? CLong_KAN("千一") 1001 ? CLong_KAN("千二百十三") 1213 ? CLong_KAN("二千") 2000 ? CLong_KAN("二千一") 2001 ? CLong_KAN("二千二百十三") 2213 ? CLong_KAN("二千十九") 2019 質問文を読んで興味半分で作ったに過ぎません。 あくまでも、未完の関数と思って参考になさって下さい。
補足
どうもありがとうございます。 ちなみにエクセル・ワードの初歩的なことしか知らないんですが、この関数式をどう生かせば、エクセルもしくは、ワードの中の漢数字を変換できるのでしょう?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 今、ここのカテゴリで自分の発言を確認しましたが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1832474 百二十五 →125 ではありませんでした。Word用のマクロとしてなら、作れそうな気がします。ただ、そういうソフトというよりも、Perl やAwkなどのスクリプトがありそうな気がします。内容的にはマクロもスクリプトもあまり変わりませんが。
お礼
どうもありがとうございます。
お礼
どうもありがとうございます。 これは、ずぶの素人の私でも使えそうです。 感謝いたします。