初めに
会社の文章のポリシーで洋数字が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 = "↓ココをコピーして使って下さい" ;