Snippets

sironekotoro 漢数字をアラビア数字にする(正規表現利用)

Created by sironekotoro
#!/usr/bin/perl
use strict;
use warnings;

# 今回のように、スクリプト内に直接マルチバイト文字(日本語の全角文字など)を
# 使う場合には use utf8; する
use utf8;

# スクリプト内に書かれたマルチバイト文字(日本語の全角文字など)を標準出力する
# 場合には Encode モジュールを使う。
use Encode qw/encode_utf8/;

# 0〜99までの数字を漢数字を受け取ってアラビア数字にする

# 与えられる文字列
my @array = (
    '一',    '二',       '十',       '十一',
    '三四', '二十一', '三十四', '三十',
    '三〇'
);

for my $arabic_number (@array) {

    # 漢数字を数字に置き換える
    # 置換できなかったものは無視される
    $arabic_number =~ s/〇/0/;
    $arabic_number =~ s/一/1/;
    $arabic_number =~ s/二/2/;
    $arabic_number =~ s/三/3/;
    $arabic_number =~ s/四/4/;
    $arabic_number =~ s/五/5/;
    $arabic_number =~ s/六/6/;
    $arabic_number =~ s/七/7/;
    $arabic_number =~ s/八/8/;
    $arabic_number =~ s/九/9/;
    $arabic_number =~ s/十/10/;

# 上記の置換でアラビア数字が2桁以下になるものであれば、
# この時点で置換は完成している
# 一 => 1
# 二 => 2
# 十 => 10
# 三四 => 34
# 三〇 => 30

# アラビア数字が3桁以上のものには、さらに置換で対応する
# 10が先頭にあるか、それ以外かでグループ分けできそう
# 十一 => 101    正解は 11
# 二十一 => 2101 正解は 21
# 三十四 => 3104 正解は 34
# 三十 => 310    正解は 30

    if ( $arabic_number > 100 ) {

        # 先頭に10がある時はそれを1に置換する
        $arabic_number =~ s/^10/1/;
        # それ以外の10は置換を使って削除する
        $arabic_number =~ s/10//;

    }

    print encode_utf8($arabic_number) . "\n";

}

Comments (0)