命数法―日本人が読み易い数値表現→アルゴリズム&秀丸マクロ公開
以下の数字をスラスラと読めるだろうか。
12345678901234567890
数字は桁が大きくなるにつれて、一気に読みづらくなっていく。
そこで、以下のような表現(命数法)に変換するアルゴリズムを紹介する。なお、この記事では実例として「秀丸エディタのマクロによる実装」も紹介する。
ウェブライターはこのマクロを使用して、数値を分かりやすくミス無く表現できるようにしてもらいたい。
1億2,045万6,789
1京2,340兆9億4,567
なお本来の命数法では「千」を使うが、ここでは用いていない。
なぜなら「千を使わずにカンマ(,)を使った方が可読性が高い」ためだ。
それでは、数値を命数法の表現に変換するアルゴリズムを紹介する。
※ 一般公開するマクロ(無料版)も、シェアウェア版のマクロ(有料版)それぞれ、著作権を放棄していないし、誤動作等にも保証はしていない。個人開発である故、ご了承願いたい。
STEP1)数値を右揃えにする
まず、数値を右揃えにする。
※ これは実際のコンピュータ処理では不要
※ 桁を逆から処理すれば良い
※ 秀丸マクロでは、先頭を0埋めし、20桁表記にする
STEP2)数値の4桁分解
続けて、数値を右から4桁ずつに分割する。
STEP3)不要な0除去
4桁ずつに分解した数字において、左側から0が連続している場合、その0を除外する
STEP4)分解した各値の3桁目へ「,」もしくは「千」を挿入
分割後0を除外した結果において、4桁の長さがある場合、3桁目に「,」を追加する。
※ 必要なら、「,」ではなく「千」を使ってもよい
※ ただし「千」で表記するより、「,」を使った方が平易で見やすい
STEP5)分割したそれぞれのブロックへ単位を補完し、結合する
最後に、各ブロックに単位を加え結合する。
これで問題なく命数法による表現に変換できる。
またこのアルゴリズムを用いれば「正規表現の組み合わせ」で変換できる。
秀丸マクロによる実装例
秀丸マクロによる実装は、正規表現を組み合わせて実現するほうが簡単だし、高速に処理できる。
実装例は以下の通り。
replaceallfast "^", "00000000000000000000", regular, nohilight;
replaceallfast ".*([0-9]{20})$", "\\1", regular, nohilight;
replaceallfast "([0-9])([0-9]{3})", "\\1,\\2 ", regular, nohilight;
replaceallfast "^[ ]+|[ ]$", "", regular, nohilight;
replaceallfast "0,0*", "", regular, nohilight;
replaceallfast "[ ]$", "万", regular, nohilight;
replaceallfast "[ ]([0-9,]+)$", "万\\1", regular, nohilight;
replaceallfast "[ ]([0-9,万]+)$", "億\\1", regular, nohilight;
replaceallfast "[ ]([0-9,万億]+)$", "兆\\1", regular, nohilight;
replaceallfast "[ ]([0-9,万億兆]+)$", "京\\1", regular, nohilight;
replaceallfast "([万億兆京])[万億兆京]+", "\\1", regular, nohilight;
replaceallfast "^([万億兆京]+)", "", regular, nohilight;
このコードは20桁までの整数を命数法に則ってフォーマットする。
秀丸マクロによる変換例
1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890
12345678901
123456789012
1234567890123
12345678901234
123456789012345
1234567890123456
12345678901234567
123456789012345678
1234567890123456789
12345678901234567890
1
12
123
1234
12345
123456
1234567
10345678
120456789
1230567890
12340678901
123450089012
1234560090123
12345670001234
123456000012345
1234500090003456
12340000900004567
123000000010005678
1234567890120000789
12345678901230000000
1
12
123
1,234
1万2,345
12万3,456
123万4,567
1,234万5,678
1億2,345万6,789
12億3,456万7,890
123億4,567万8,901
1,234億5,678万9,012
1兆2,345億6,789万123
12兆3,456億7,890万1,234
123兆4,567億8,901万2,345
1,234兆5,678億9,012万3,456
1京2,345兆6,789億123万4,567
12京3,456兆7,890億1,234万5,678
123京4,567兆8,901億2,345万6,789
1,234京5,678兆9,012億3,456万7,890
1
12
123
1,234
1万2,345
12万3,456
123万4,567
1,034万5,678
1億2,045万6,789
12億3,056万7,890
123億4,067万8,901
1,234億5,008万9,012
1兆2,345億6,009万123
12兆3,456億7,000万1,234
123兆4,560億1万2,345
1,234兆5,000億9,000万3,456
1京2,340兆9億4,567
12京3,000兆1,000万5,678
123京4,567兆8,901億2,000万789
1,234京5,678兆9,012億3,000万
秀丸マクロによる実装例の解説
まず、以下のコードで、先頭0埋めした20桁の数値に変換する。
桁数を増やす必要があれば、1行目の0の個数を増やし、2行目の20の指定を目的の桁数に変更することで対応できる。
なお、桁数を増やす場合、必ず4の倍数にすること。
replaceallfast "^", "00000000000000000000", regular, nohilight;
replaceallfast ".*([0-9]{20})$", "\\1", regular, nohilight;
続けて、以下のコードで4桁ずつに分解する。
replaceallfast "([0-9])([0-9]{3})", "\\1,\\2 ", regular, nohilight;
その後、以下のコードで無用な0を除去する。
replaceallfast "0,0*", "", regular, nohilight;
なお、以下のコードは無用な半角スペースを除去する。
以降の処理で、この半角スペースを各桁の単位へ変換するため、無用なスペースは除去しておく訳だ。
replaceallfast "^[ ]+|[ ]$", "", regular, nohilight;
あとは、半角スペースを各桁の単位へ変換する。
この仕組ならより大きな桁へ対応するのも簡単。
replaceallfast "[ ]([0-9,]+)$", "万\\1", regular, nohilight;
replaceallfast "[ ]([0-9,万]+)$", "億\\1", regular, nohilight;
replaceallfast "[ ]([0-9,万億]+)$", "兆\\1", regular, nohilight;
replaceallfast "[ ]([0-9,万億兆]+)$", "京\\1", regular, nohilight;
なお、正規表現において「先頭0を除去し、分解した結果が4桁ある場合」という判定は難しいことは抑えておきたい。
そこで、最終結果において、各単位が連続する場合、最初の単位を残しそれ以外は除去する考慮が必要となる。
例)12345678900004567
✕ 1京2,345兆6,789億万4,567
○ 1京2,345兆6,789億4,567
※億万と単位が連続しているので、億だけを残し残りの単位を除去する
この考慮をするのが以下のコードである。
replaceallfast "([万億兆京])[万億兆京]+", "\\1", regular, nohilight;
同様に、「先頭で単位が連続している場合、それを除去する」という考慮も必要だ。
この考慮をするのが以下のコードである。
replaceallfast "^([万億兆京]+)", "", regular, nohilight;
最後に
計算を目的として数字を扱う場合と、情報を発信する場合に数字を扱う場合がある。
特に巨大な数字を扱っている場合に、情報を発信する用途で数字を表現するなら「読み易さに配慮した表現」が必要だ。
それには命数法による表現が適している。
こうした数値の変換(数値の表現)は
・煩雑で無意味
・ミスを起こしやすい
・そもそも自動化は簡単にできる
ため、できるだけマクロ化して自動化する方が望ましい。
もしもあなたがSEOライター・ウェブライターであるならば、こうした自動化出来るところは積極的に自動化し、執筆速度向上に務めると良いだろう。
実際、以下の記事を執筆するにあたって、このマクロは重宝した。
ということで、この記事は以上です!
よかったら、noteやTwitterのフォロー、YouTubeのチャンネル登録をお願いします✊
↓ ↓ ↓ YouTubeチャンネル登録お願いします(っ'-') =͟͟͞͞👍 ブォン ↓ ↓ ↓
↓ ↓ ↓ Twitterのフォローもお願いします📲_(:3」∠)_ ↓ ↓ ↓
↓ ↓ ↓ ブログ運営中💻⊂(・x・)⊃📱です ↓ ↓ ↓
↓ ↓ ↓ SEOライティング他ご依頼受付中です😉 ↓ ↓ ↓
有料版マクロのダウンロード
本記事内で公開したマクロで事足りるのですが、しかし
・選択した部分だけを命数法による表現へ変換することができない
・テキスト入力で指定された十進数の値を命数法へ変換する方法がない
のは面倒なので、これらを実装しました。
また、ツールバーへ登録したり、キーボードショートカットを割り当てておくと、とても楽です。
こうした利便性に配慮したマクロを、有料(シェアウェア)公開します。
・上掲のマクロをもっと便利に使いたい場合
・SEOライター業やウェブライター業に専従している場合
は有料版の導入をお勧めしておきます。
この記事を購入すると、有料領域にてZIPファイルがダウンロードできます。最新版の秀丸エディタで使用できます。もちろん、秀丸エディタのマクロなので、Windows限定です。
なお、デジタルコンテンツの性質上、有料記事購入後のキャンセルはできません。
以降、有料領域です。
ここから先は
¥ 100
Amazonギフトカード5,000円分が当たる
記事を読んでいただき、ありがとうございます。何かの参考になりましたら、ツイッター等でシェアして頂けると嬉しいです!😉 サポートいただけるとモチベアップに繋がります!