JSの半角→全角変換

1
2
3
4
5
6
7
8
9
<script>
    function zenkaku2Hankaku(str){
        return str.replace(/[A-Za-z0-9]/g, function(s){
            return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
        });
    }
 
    console.log(zenkaku2Hankaku("123abC"));
</script>

JSで書く場合も基本はスクリプトの中に辞書を持って変換しているのね。
仕組みを理解した。

カナ→ローマ字変換

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
mb_internal_encoding('utf-8');
$kana2romaji = new Kana2Romaji;
 
$str = "これは、ローマじへんかんのじっけんです";
 
$result = $kana2romaji->convert($str);
header("Content-type: text/html;charset=utf8");
 
echo $result;
 
class Kana2Romaji {
    function convert($str){
        $str = mb_convert_kana($str, "cHV", "utf-8");
 
        $kana = array(
            'きゃ', 'きぃ', 'きゅ', 'きぇ', 'きょ',
            'ぎゃ', 'ぎぃ', 'ぎゅ', 'ぎぇ', 'ぎょ',
            'くぁ', 'くぃ', 'くぅ', 'くぇ', 'くぉ',
            'ぐぁ', 'ぐぃ', 'ぐぅ', 'ぐぇ', 'ぐぉ',
            'しゃ', 'しぃ', 'しゅ', 'しぇ', 'しょ',
            'じゃ', 'じぃ', 'じゅ', 'じぇ', 'じょ',
            'ちゃ', 'ちぃ', 'ちゅ', 'ちぇ', 'ちょ',
            'ぢゃ', 'ぢぃ', 'ぢゅ', 'ぢぇ', 'ぢょ',
            'つぁ', 'つぃ', 'つぇ', 'つぉ',
            'てゃ', 'てぃ', 'てゅ', 'てぇ', 'てょ',
            'でゃ', 'でぃ', 'でぅ', 'でぇ', 'でょ',
            'とぁ', 'とぃ', 'とぅ', 'とぇ', 'とぉ',
            'にゃ', 'にぃ', 'にゅ', 'にぇ', 'にょ',
            'ヴぁ', 'ヴぃ', 'ヴぇ', 'ヴぉ',
            'ひゃ', 'ひぃ', 'ひゅ', 'ひぇ', 'ひょ',
            'ふぁ', 'ふぃ', 'ふぇ', 'ふぉ',
            'ふゃ', 'ふゅ', 'ふょ',
            'びゃ', 'びぃ', 'びゅ', 'びぇ', 'びょ',
            'ヴゃ', 'ヴぃ', 'ヴゅ', 'ヴぇ', 'ヴょ',  
            'ぴゃ', 'ぴぃ', 'ぴゅ', 'ぴぇ', 'ぴょ',
            'みゃ', 'みぃ', 'みゅ', 'みぇ', 'みょ',  
            'りゃ', 'りぃ', 'りゅ', 'りぇ', 'りょ',
            'うぃ', 'うぇ', 'いぇ'
        );
         
        $romaji  = array(
            'kya', 'kyi', 'kyu', 'kye', 'kyo',
            'gya', 'gyi', 'gyu', 'gye', 'gyo',
            'qwa', 'qwi', 'qwu', 'qwe', 'qwo',
            'gwa', 'gwi', 'gwu', 'gwe', 'gwo',
            'sya', 'syi', 'syu', 'sye', 'syo',
            'ja', 'jyi', 'ju', 'je', 'jo',
            'cha', 'cyi', 'chu', 'che', 'cho',
            'dya', 'dyi', 'dyu', 'dye', 'dyo',
            'tsa', 'tsi', 'tse', 'tso',
            'tha', 'ti', 'thu', 'the', 'tho',
            'dha', 'di', 'dhu', 'dhe', 'dho',
            'twa', 'twi', 'twu', 'twe', 'two',
            'nya', 'nyi', 'nyu', 'nye', 'nyo',
            'va', 'vi', 've', 'vo',
            'hya', 'hyi', 'hyu', 'hye', 'hyo',
            'fa', 'fi', 'fe', 'fo',
            'fya', 'fyu', 'fyo',
            'bya', 'byi', 'byu', 'bye', 'byo',
            'vya', 'vyi', 'vyu', 'vye', 'vyo',
            'pya', 'pyi', 'pyu', 'pye', 'pyo',
            'mya', 'myi', 'myu', 'mye', 'myo',
            'rya', 'ryi', 'ryu', 'rye', 'ryo',
            'wi', 'we', 'ye'
        );
 
        $str = $this->kana_replace($str, $kana, $romaji);
 
        $kana = array(
            'あ', 'い', 'う', 'え', 'お',
            'か', 'き', 'く', 'け', 'こ',
            'さ', 'し', 'す', 'せ', 'そ',
            'た', 'ち', 'つ', 'て', 'と',
            'な', 'に', 'ぬ', 'ね', 'の',
            'は', 'ひ', 'ふ', 'へ', 'ほ',
            'ま', 'み', 'む', 'め', 'も',
            'や', 'ゆ', 'よ',
            'ら', 'り', 'る', 'れ', 'ろ',
            'わ', 'ゐ', 'ゑ', 'を', 'ん',
            'が', 'ぎ', 'ぐ', 'げ', 'ご',
            'ざ', 'じ', 'ず', 'ぜ', 'ぞ',
            'だ', 'ぢ', 'づ', 'で', 'ど',
            'ば', 'び', 'ぶ', 'べ', 'ぼ',
            'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ'
        );
 
        $romaji = array(
            'a', 'i', 'u', 'e', 'o',
            'ka', 'ki', 'ku', 'ke', 'ko',
            'sa', 'shi', 'su', 'se', 'so',
            'ta', 'chi', 'tsu', 'te', 'to',
            'na', 'ni', 'nu', 'ne', 'no',
            'ha', 'hi', 'fu', 'he', 'ho',
            'ma', 'mi', 'mu', 'me', 'mo',
            'ya', 'yu', 'yo',
            'ra', 'ri', 'ru', 're', 'ro',
            'wa', 'wyi', 'wye', 'wo', 'n',
            'ga', 'gi', 'gu', 'ge', 'go',
            'za', 'ji', 'zu', 'ze', 'zo',
            'da', 'ji', 'du', 'de', 'do',
            'ba', 'bi', 'bu', 'be', 'bo',
            'pa', 'pi', 'pu', 'pe', 'po'
        );
 
        $str = $this->kana_replace($str, $kana, $romaji);
 
        $str = preg_replace('/(っ$|っ[^a-z])/u', "xtu", $str);
        $res = preg_match_all('/(っ)(.)/u', $str, $matches);
        if(!empty($res)){
            for($i=0;isset($matches[0][$i]);$i++){
                if($matches[0][$i] == 'っc') $matches[2][$i] = 't';
                $str = preg_replace('/' . $matches[1][$i] . '/u', $matches[2][$i], $str, 1);
            }
        }
        $kana = array(
            'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ',
            'ヵ', 'ヶ', 'っ', 'ゃ', 'ゅ', 'ょ', 'ゎ', '、', '。', ' '
        );
          
        $romaji = array(
            'a', 'i', 'u', 'e', 'o',
            'ka', 'ke', 'xtu', 'xya', 'xyu', 'xyo', 'xwa', ', ', '.', ' '
        );
        $str = $this->kana_replace($str, $kana, $romaji);
        $str = preg_replace('/^ー|[^a-z]ー/u', '', $str);
        $res = preg_match_all('/(.)(ー)/u', $str, $matches);
 
        if($res){
            for($i=0;isset($matches[0][$i]);$i++){
                if( $matches[1][$i] == "a" ){ $replace = 'â'; }
                else if( $matches[1][$i] == "i" ){ $replace = 'î'; }
                else if( $matches[1][$i] == "u" ){ $replace = 'û'; }
                else if( $matches[1][$i] == "e" ){ $replace = 'ê'; }
                else if( $matches[1][$i] == "o" ){ $replace = 'ô'; }
                else { $replace = ""; }
                  
                $str = preg_replace('/' . $matches[0][$i] . '/u', $replace, $str, 1);
            }
        }
        return $str;
    }
 
    function kana_replace($str, $kana, $romaji){
        $patterns = array();
        foreach($kana as $value){
            $patterns[] = "/" . $value . "/";
        }
        $str = preg_replace($patterns, $romaji, $str);
        return $str;
    }
}

なるほど、プログラムの中に辞書を作っておいて、変換してる訳ね。

PHPの和暦→西暦

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
ini_set('display_errors', "On");
 
function seireki($wareki_year){
 
    $wareki_year = str_replace("元年", "1年", mb_convert_kana($wareki_year, "n"));
 
    if(preg_match('!^(明治|大正|昭和|平成|令和)([0-9]+)年$!', $wareki_year, $matches)){
 
        $era_name = $matches[1];
        $year = intval($matches[2]);
 
        if($era_name === "明治"){
            $year += 1867;
        } else if($era_name === "大正"){
            $year += 1911;
        } else if($era_name === "昭和"){
            $year += 1925;
        } else if($era_name === "平成"){
            $year += 1988;
        } else if($era_name === "令和"){
            $year += 2018;
        }
 
        return $year . "年";
    }
    return null;
}
echo seireki("平成元年");

$ php index.php
1989年

preg_matchで元号と年を分割する訳ね。なるほど、ロジックはわかった。

PHPの西暦→和暦変換

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
ini_set('display_errors', "On");
 
function wareki($year){
 
    $eras = array(
        array('year' => 2018, "name" => "令和"),
        array('year' => 1988, "name" => "平成"),
        array('year' => 1925, "name" => "昭和"),
        array('year' => 1911, "name" => "大正"),
        array('year' => 1867, "name" => "明治")
    );
 
    foreach($eras as $era){
 
        $base_year = $era['year'];
        $era_name = $era['name'];
 
        if($year > $base_year){
            $era_year = $year - $base_year;
 
            if($era_year === 1){
                return $era_name . "元年";
            }
 
            return $era_name . $era_year ."年";
        }
    }
    return null;
}
 
echo wareki(1989);

$ php index.php
平成元

なるほど、これは凄い

数字のカンマ、カンマ削除

1
2
$num = 100000;
echo number_format($num);

$ php index.php
100,000

カンマ除去

1
2
$num = "100,000";
echo str_replace(",", "", $num);

$ php index.php
100000

半角カナ→全角カナ

1
2
$str = "キャピタルメディア";
echo mb_convert_kana($str, "KV");

$ php index.php
キャピタルメディア

全角カナ→半角カナ

1
2
$str = "キャピタルメディア";
echo mb_convert_kana($str, "kV");

$ php index.php
キャピタルメディアva

カナ以外にも、数字、英字、スペースも変換できる。なるほど。

日付変換

1
2
$date = "20230321";
echo date("Y/m/d", strtotime($date));

php index.php
2023/03/21

1
2
$date = "20230321";
echo date("Y年m月d日", strtotime($date));

$ php index.php
2023年03月21日

ゼロパディング、前ゼロ除去

ゼロパディング

1
2
3
$num = 7;
$num2 = sprintf('%03d', $num);
echo $num2;

$ php index.php
007

前ゼロ除去
L intにキャスト

1
2
3
$str = "00070";
$str = (int)$str;
echo $str;

ltrim

1
2
3
$str = "00070";
$str = ltrim($str, 0);
echo $str;

php 文字列の結合

1
2
3
4
5
$intermediate = "-";
$var1 = "いつかは";
$var2 = "ゆかし";
$joined = $var1 . $intermediate . $var2;
echo $joined;

$ php index.php
いつかは-ゆかし

php 真偽値

1
2
3
4
5
6
$var = true;
if($var){
    echo "成功";
} else {
    echo "失敗";
}

$ php index.php
成功

1
2
3
4
5
6
$var = false;
if($var){
    echo "成功";
} else {
    echo "失敗";
}

$ php index.php
失敗

ifでtrue, falseを判定できる

pythonのdebug

pdbを使用できる

1
2
3
4
5
6
7
8
9
10
11
12
13
import pdb
 
def factorial(n, sum=0):
    if n == 0:
        return sum
 
    pdb.set_trace()
    sum += n
    print(sum)
    return factorial(n-1, sum)
 
if __name__ == "__main__":
    factorial(5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ python3 test.py
> /home/vagrant/dev/test/test.py(8)factorial()
-> sum += n
(Pdb) bt
  /home/vagrant/dev/test/test.py(13)<module>()
-> factorial(5)
> /home/vagrant/dev/test/test.py(8)factorial()
-> sum += n
(Pdb) list
  3     def factorial(n, sum=0):
  4         if n == 0:
  5             return sum
  6    
  7         pdb.set_trace()
  8  ->      sum += n
  9         print(sum)
 10         return factorial(n-1, sum)
 11    
 12     if __name__ == "__main__":
 13         factorial(5)
(Pdb)

Pythonのテストコード

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
# coding:utf-8
 
import unittest
import fizzbuzz as fb
 
class FizzBuzzTest(unittest.TestCase):
    def setUp(self):
        pass
 
    def tearDown(self):
        pass
 
    def test_normal(self):
        self.assertEqual(1, fb.fizzbuzz(1))
 
    def test_fizz(self):
        self.assertEqual("Fizz", fb.fizzbuzz(3))
 
    def test_buzz(self):
        self.assertEqual("Buzz", fb.fizzbuzz(5))
 
    def test_fizzbuzz(self):
        self.assertEqual("FizzBuzz", fb.fizzbuzz(3))
 
if __name__ == "__main__":
    unittest.main()

メインコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# coding:utf-8
 
def fizzbuzz(number):
    if number % 15 == 0:
        return "FizzBuzz"
    if number % 5 == 0:
        return "Buzz"
    if number % 3 == 0:
        return "Fizz"
 
    return number
 
if __name__ == "__main__":
    for i in range(1, 101):
        print(fizzbuzz(i))

t$ python3 test_fizzbuzz.py
..F.
======================================================================
FAIL: test_fizzbuzz (__main__.FizzBuzzTest)
———————————————————————-
Traceback (most recent call last):
File “test_fizzbuzz.py”, line 23, in test_fizzbuzz
self.assertEqual(“FizzBuzz”, fb.fizzbuzz(3))
AssertionError: ‘FizzBuzz’ != ‘Fizz’
– FizzBuzz
+ Fizz

———————————————————————-
Ran 4 tests in 0.002s

FAILED (failures=1)