2014年11月16日

C#でRegexを使い文字列の一部を書き換える

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その49

元の問題の題は「税込み価格への修正」なのですが、タイトルを変更しています。

■問題 (出題者:にしお さん)
ここにチラシの原稿があります。例えば「ダイコン150円、ハクサイ120円、ジャガイモ30円」のような文字列です。
法改正によって商品の値段は税込み表示にしないといけなくなりました。
そこで、与えられた文字列の中から税抜き価格を見つけ出し、 税込み価格に変更した文字列を返す関数を作ってください。
なお、税抜き価格は半角の数字の連なりで、かつ半角の数字の連なりはすべて税抜き価格だとします。
「9,800円」「百円」「100円」「100g80円」などのような記述はないと考えてかまいません。
また税込み価格は税抜き価格の1.05倍で、端数は切り捨てとしてください。

MatchEvaluator を受け取る Replaceメソッドを使って実装しました。
呼び出しインターフェースは以下の通り。

public string Replace (
     string input,
     MatchEvaluator evaluator
)

このメソッドは、指定した入力文字列内で指定した正規表現に一致するすべての文字列を、 MatchEvaluator デリゲートによって返される文字列に置換します。
この手の文字列操作は、Regex使わないととても面倒ですね。

せっかくなので、税込み5%の価格表示のものを 税込み8%の価格に変更する ReplaceTax5to8 メソッドも 書いてみました。
地味な問題ですが、Regexの持つパワーを教えてくれる良問ですね。

using System;
using System.Text.RegularExpressions;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            string s = "test100円xyz438円、8130円";
            Console.WriteLine(ReplaceTax(s));
            Console.ReadLine();
        }

         // Regexを使えば、完結に書ける。使わないと、ものすごく面倒。
        public static string ReplaceTax(string s) {
            return Regex.Replace(
                        s,
                        @"\d+",
                        m => ((int)(int.Parse(m.Value) * 1.05)).ToString()
                   );
        }

        public static string ReplaceTax5to8(string s) {
            return Regex.Replace(
                        s,
                        @"\d+",
                        m =>  ((int)(Math.Ceiling((int.Parse(m.Value) / 1.05)) * 1.08)).ToString());
        }       
     }
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52384216