LoginSignup
0
0

More than 3 years have passed since last update.

洋数字が1桁の時は全角、2桁以上の時は半角にするツール

Last updated at Posted at 2020-05-14

初めに

会社の文章のポリシーで洋数字が1桁の時は全角、2桁以上の時は半角にするというルールがありました。
いちいち手作業で直していると時間の無駄なのでツールを作りました。

簡単な仕様

  • 洋数字が1桁の時は全角、2桁以上の時は半角
  • 数字に挟まれた, . : / は半角に変換
  • 数字の間に, . : /があって2桁以上なら半角
    • (例)1,000、5/5、1:30 などは半角

簡単な設計

  • 最初に数字を全て半角にする
  • 1桁の数字を全角に変換
    • 前後の数字だけでなく , . : / にも注意する
    • 文頭は改行前の値を気にしない
    • 文末も次の段落の頭の文字を気にしない
    • etc...

ソースコード(javaScript)

初めに変数、hanに半角洋数字を、zenに全角洋数字を代入

var han = "0123456789";
var zen = "0123456789";

フォームから送られてきた値を変数textに挿入

  var text = document.henkan.mytext.value;

全ての数字を一度半角に変換

for文で、変数textの文字数処理を行う

  • text.charAt(i)で文字を取得
  • 上で取得した文字を、indexOfで変数zenに格納されている全角数字があるか探す。
  • あればn = zen.indexOf(c,0);で変数zenの何番目の文字に該当するか調べ変数nに代入、なければ0を代入
  • if (n >= 0)で検索しても、あれば、han.charAt(n);で変数hanの何番目かを調べ、それに変換し、変数cに代入。
  • 変数cの値を変数strに入れていく
  var str = "";
  for (i=0; i<text.length; i++){
    c = text.charAt(i);
    n = zen.indexOf(c,0);
    if (n >= 0){
      c = han.charAt(n);
      str += c;
    }else{
      str += c;
    }
  }

数字に挟まれた, . : / は半角に変換

※以下の(\d+?)●(\d+?)の●の部分は全角です

str = str
  .replace(/(\d+?)/(\d+?)/g, "$1"+"/"+"$2")
  .replace(/(\d+?).(\d+?)/g, "$1"+"."+"$2")
  .replace(/(\d+?),(\d+?)/g, "$1"+","+"$2")
  .replace(/(\d+?):(\d+?)/g, "$1"+":"+"$2");

1桁の数字は全角に

※以下のvar CONV_TABLE = ["0","1","2","3","4","5","6","7","8","9"];の洋数字は全角

str = str.replace(/(^|(?:[^0-9.,:/]))([0-9])((?![0-9.,:/])|$)/g,
  function(m) {
    var CONV_TABLE = ["0","1","2","3","4","5","6","7","8","9"];
    var s, n;
    if (m.length == 1) {
      s = "";
      n = CONV_TABLE[parseInt(m)];
    } else {
      s = m.charAt(0);
      n = CONV_TABLE[parseInt(m.charAt(1))];
    }
    return s + n;
  });

ユーザーが視覚的に数字の全角半角を確認できるようにする

- 変数str_chkを作り、ユーザーが確認できるように一桁洋数字には赤、2桁(記号含む)以上には青色で画面に返す

※以下の2行目のstr_chk = str_chk.replace(/([0-9]{1})/g, "<span class=\"bkred\">"+"$1"+"</span>");の洋数字は全角です

  str_chk = str
  str_chk = str_chk.replace(/([0-9]{1})/g, "<span class=\"bkred\">"+"$1"+"</span>");
  str_chk = str_chk.replace(/([0-9]+)([.,:/]{1})([0-9]+)([.,:/]{1})([0-9]+)/g, "<span class=\"bkblue\">"+"$1$2$3$4$5"+"</span>");
  str_chk = str_chk.replace(/([0-9]+)([.,:/]{1})([0-9]+)/g, "<span class=\"bkblue\">"+"$1$2$3"+"</span>");
  str_chk = str_chk.replace(/(\d{2,})/g, "<span class=\"bkblue\">"+"$1"+"</span>");
  var text = new String;
  text = '<div style="font-weight:bold;">■<span style="color:red;">1桁</span>の洋数字は<span style="color:red;">赤</span> <span style="color:blue;">2桁以上</span>は<span style="color:blue;">青</span>で表示されます。</div>';
  document.henkan.mytext.value = str;
  str_chk = str_chk.replace(/\r\n|\n/g, '<br>');
  document.getElementById('preview').innerHTML = str_chk;
  document.getElementById('kome').innerHTML = "↓ココをコピーして使って下さい" ;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0