sikaku

漢数字変換用関数

数値を漢数字に変換するJavaScript用関数です。

現状、整数のみ対応。小数対応させるならだいぶ処理変える必要がありそう🤔

source code

関数

JavaScript
  1. function cjkConverter(num,type){
  2. switch(typeof num){
  3. case 'number' : num+= '';
  4. case 'string' : num = num.replace(/\D+/g,'');break;
  5. default : return false;
  6. }
  7. if(type&&type!='each'&&type!='place') return false;
  8. var cjk_n = ['○','一','二','三','四','五','六','七','八','九'];
  9. var place = ['零','十','百','千','万','億','兆','京'];
  10. if(type=='each'||!type||num.length/4>place.length-3){
  11. return num.replace(/\d/g,s=>cjk_n[parseInt(s)]);
  12. }
  13. if(!parseInt(num)) return place[0];
  14. var n,str='';
  15. var arr=num.match(/\d{1,4}?(?=(\d{4})*$)/gm);
  16. for(var i=0,k=arr.length-1;i<=k;i++){
  17. if(!parseInt(arr[i])) continue;
  18. for(var j=0,l=arr[i].length-1;j<=l;j++){
  19. n=parseInt(arr[i][j]);
  20. if(!n) continue;
  21. if(j==l) str+=cjk_n[n];
  22. else str+=(n>1?cjk_n[n]:'')+place[l-j];
  23. }
  24. if(i!=k) str+=place[k-i+3];
  25. }
  26. return str;
  27. }

呼び出し

cjkConverter(num,type)

→例:cjkConverter(12345,'place')

引数
num
  • ここの数値が漢数字変換される
  • number型,string型どちらかで指定
type
  • 変換内容を決められる
  • string型で指定
  • 下記どちらか

'each'桁表記無し

呼:cjkConverter(12345,'each')

戻:一二三四五

未指定時デフォルト選択

'place'桁表記有り

呼:cjkConverter(12345,'place')

戻:一万二千三百四十五

桁制限有

最大9999京以下略までしか変換できません。

超過時は'each'選択時と同処理になります。

対応させたい場合は後述編集を。

二種選択時に依る違いを見る

  • 0
  • 0
戻り値

string型

編集

対応桁数を増やす

デフォルトでは桁表記有変換時、最大数値は9999京以下略(1垓-1)です。

増やしたい場合は配列内に昇順で桁を足していってください。

  1. var place = ['零','十','百','千','万','億','兆','京','垓','𥝱','穣','溝','澗','正','載','極','恒河沙','阿僧祇','那由他','不可思議','無量大数'];

漢表記数値の桁に関しては、諸説あるためお好みの物を採用してください。

旧字体に変更したい

の文字をそれぞれお好きなように置き換えてください。

  1. var cjk_n = ['○','壱','弐','参','肆','伍','陸','漆','捌','玖'];
  2. var place = ['零','拾','佰','仟','萬','億','兆','京'];

使用例

demo
2018年 10月03日
JavaScript
  1. document.addEventListener('DOMContentLoaded',function(){
  2. document.querySelectorAll('.cjk_each,.cjk_place').forEach(function($tgt){
  3. var type = $tgt.classList.contains('cjk_each')? 'each':'place';
  4. $tgt.textContent = $tgt.textContent.replace(/\d+/g,str=>cjkConverter(str,type));
  5. });
  6. });
HTML
  1. <span class="cjk_each">2018年</span>
  2. <span class="cjk_place">10月03日</span>
  • cjk_each(桁無)cjk_place(桁有)どちらかのクラスを持つ要素内の数字を変換
  • 日付表記がアラビア数字のみのブログなんかで使えるんじゃないでしょうか。