Comment detail

整数の漢数字表記 (Nested Flatten)
うーん、全然スマートにならなかった・・・
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use strict;
use warnings;
use bigint;
use Test::Simple tests => 12;

my %kanji_of =
  (1 => '一',  2 => '二',  3 => '三',  4 => '四',  5 => '五',
   6 => '六',  7 => '七',  8 => '八',  9 => '九' );

my @keta = ('千','百','十','');
my @big_keta = ('', '万','億','兆');


sub to_kanji{
  my $num = shift;
  $num = '0'.$num until (length($num) % 4 == 0);
  my @list = grep {defined $_} ( $num =~ m/(\d{4})?(\d{4})?(\d{4})?(\d{4})$/ );
  my $ret =  append_man_oku_tyo( map {to_kanji_sub($_)} @list );
  return $ret;
}

sub append_man_oku_tyo{
  my @list = @_;
  my $i = 0;
  my $str = join ' ', grep {$_}
    reverse map {$_ . ($_? $big_keta[$i++]:($i++,'')) }
    reverse @list;
  return $str;
}

#4桁の数字を漢字に変換
sub to_kanji_sub{
  my @num = split //, shift;
  return join '', map {
    $num[$_] ? ( $_ != 3 && $num[$_] == 1 ? '': $kanji_of{$num[$_]}).$keta[$_] :''
  } 0..3;
}

#テストコード
do_test();
sub do_test{
  ok(to_kanji(1) eq '一',"1 ok");
  ok(to_kanji(1234) eq '千二百三十四',"1234 ok");
  ok(to_kanji(4321) eq '四千三百二十一', "4321 ok");
  ok(to_kanji(100) eq '百', "100 ok");
  ok(to_kanji(1000) eq '千', "1000 ok");
  ok(to_kanji(1001) eq '千一', "1001 ok");
  ok(to_kanji(1021) eq '千二十一', "1021 ok ");
  ok(to_kanji(12345) eq '一万 二千三百四十五', "12345 ok");
  ok(to_kanji(10000) eq '一万' ,"10000 w");
  ok(to_kanji(1_0000_0000_0000) eq '一兆', "1_0000_0000_0000 ok");
  ok(to_kanji(1_2345_6789) eq '一億 二千三百四十五万 六千七百八十九', "1234567879 ok");
  ok(to_kanji(1732050807568877) eq '千七百三十二兆 五百八億 七百五十六万 八千八百七十七', "1732050807568877 ok");
}

Index

Feed

Other

Link

Pathtraq

loading...